অনুশীলনে, কোনও অতিরিক্ত ওভারহেড ব্যয় করা হবে না । সি ++ এ, ছোট ফাংশনগুলি সাধারণত সংযোজনকারী হিসাবে একটি অপ্টিমাইজেশন হিসাবে অন্তর্ভুক্ত থাকে, ফলে ফলস্বরূপ অ্যাসেমব্লিং কলসিটে সমস্ত ক্রিয়াকলাপ করবে - ফাংশনগুলি একে অপরকে কল করবে না, যেহেতু ফাংশনগুলি চূড়ান্ত কোডে থাকবে না, কেবলমাত্র গাণিতিক ক্রিয়াকলাপ।
সংকলকটির উপর নির্ভর করে আপনি দেখতে পাচ্ছেন যে এই ফাংশনগুলির মধ্যে একটি অপরকে কম বা কম অপ্টিমাইজেশান (ডিবাগ বিল্ডগুলির মতো) দিয়ে কল করছে। উচ্চতর অপ্টিমাইজেশন স্তরে যদিও (রিলিজ বিল্ডগুলি), সেগুলি কেবলমাত্র গণিতের জন্য অনুকূলিত হবে।
আপনি যদি এখনও এটি সম্পর্কে পেডেন্টিক হতে চান (বলুন আপনি একটি লাইব্রেরি তৈরি করছেন), (এবং অনুরূপ মোড়ক ফাংশনগুলির) inline
কীওয়ার্ডটি operator*()
ইনলাইন সম্পাদন করতে আপনার সংকলককে ইঙ্গিত করতে পারে, বা সংকলক-নির্দিষ্ট পতাকা / বাক্য গঠন যেমন: -finline-small-functions
, -finline-functions
, -findirect-inlining
, __attribute__((always_inline))
(মন্তব্যে @Stephane Hockenhull এর সহায়ক তথ্য কৃতিত্ব) । ব্যক্তিগতভাবে, আমি যে ফ্রেমওয়ার্ক / লিবগুলি ব্যবহার করছি তা অনুসরণ করার ঝোঁক I'm আমি যদি জিএলকিটের গণিত লাইব্রেরি ব্যবহার করছি, আমি কেবল GLK_INLINE
এটি সরবরাহকারী ম্যাক্রোটি ব্যবহার করব ।
ক্ল্যাং (এক্সকোড 7.2 এর অ্যাপল এলএলভিএম সংস্করণ 7.0.2 / ক্ল্যাং-700.1.81) ব্যবহার করে ডাবল চেকিং , নিম্নলিখিত main()
ক্রিয়াকলাপটি (আপনার ফাংশন এবং একটি নির্বিকার Vector3<T>
প্রয়োগের সাথে মিলিয়ে ):
int main(int argc, const char * argv[])
{
Vector3<int> a = { 1, 2, 3 };
Vector3<int> b;
scanf("%d", &b.x);
scanf("%d", &b.y);
scanf("%d", &b.z);
Vector3<int> c = a * b;
printf("%d, %d, %d\n", c.x, c.y, c.z);
return 0;
}
অপ্টিমাইজেশন পতাকা ব্যবহার করে এই সমাবেশে সংকলন করুন -O0
:
.section __TEXT,__text,regular,pure_instructions
.globl _main
.align 4, 0x90
_main: ## @main
Lfunc_begin0:
.loc 6 30 0 ## main.cpp:30:0
.cfi_startproc
## BB#0:
pushq %rbp
Ltmp0:
.cfi_def_cfa_offset 16
Ltmp1:
.cfi_offset %rbp, -16
movq %rsp, %rbp
Ltmp2:
.cfi_def_cfa_register %rbp
subq $128, %rsp
leaq L_.str1(%rip), %rax
##DEBUG_VALUE: main:argc <- undef
##DEBUG_VALUE: main:argv <- undef
movl $0, -4(%rbp)
movl %edi, -8(%rbp)
movq %rsi, -16(%rbp)
.loc 6 31 15 prologue_end ## main.cpp:31:15
Ltmp3:
movl l__ZZ4mainE1a+8(%rip), %edi
movl %edi, -24(%rbp)
movq l__ZZ4mainE1a(%rip), %rsi
movq %rsi, -32(%rbp)
.loc 6 33 2 ## main.cpp:33:2
leaq L_.str(%rip), %rsi
xorl %edi, %edi
movb %dil, %cl
leaq -48(%rbp), %rdx
movq %rsi, %rdi
movq %rsi, -88(%rbp) ## 8-byte Spill
movq %rdx, %rsi
movq %rax, -96(%rbp) ## 8-byte Spill
movb %cl, %al
movb %cl, -97(%rbp) ## 1-byte Spill
movq %rdx, -112(%rbp) ## 8-byte Spill
callq _scanf
.loc 6 34 17 ## main.cpp:34:17
leaq -44(%rbp), %rsi
.loc 6 34 2 is_stmt 0 ## main.cpp:34:2
movq -88(%rbp), %rdi ## 8-byte Reload
movb -97(%rbp), %cl ## 1-byte Reload
movl %eax, -116(%rbp) ## 4-byte Spill
movb %cl, %al
callq _scanf
.loc 6 35 17 is_stmt 1 ## main.cpp:35:17
leaq -40(%rbp), %rsi
.loc 6 35 2 is_stmt 0 ## main.cpp:35:2
movq -88(%rbp), %rdi ## 8-byte Reload
movb -97(%rbp), %cl ## 1-byte Reload
movl %eax, -120(%rbp) ## 4-byte Spill
movb %cl, %al
callq _scanf
leaq -32(%rbp), %rdi
.loc 6 37 21 is_stmt 1 ## main.cpp:37:21
movq -112(%rbp), %rsi ## 8-byte Reload
movl %eax, -124(%rbp) ## 4-byte Spill
callq __ZmlIiiE7Vector3IDTmldtfp_1xdtfp0_1xEERKS0_IT_ERKS0_IT0_E
movl %edx, -72(%rbp)
movq %rax, -80(%rbp)
movq -80(%rbp), %rax
movq %rax, -64(%rbp)
movl -72(%rbp), %edx
movl %edx, -56(%rbp)
.loc 6 39 27 ## main.cpp:39:27
movl -64(%rbp), %esi
.loc 6 39 32 is_stmt 0 ## main.cpp:39:32
movl -60(%rbp), %edx
.loc 6 39 37 ## main.cpp:39:37
movl -56(%rbp), %ecx
.loc 6 39 2 ## main.cpp:39:2
movq -96(%rbp), %rdi ## 8-byte Reload
movb $0, %al
callq _printf
xorl %ecx, %ecx
.loc 6 41 5 is_stmt 1 ## main.cpp:41:5
movl %eax, -128(%rbp) ## 4-byte Spill
movl %ecx, %eax
addq $128, %rsp
popq %rbp
retq
Ltmp4:
Lfunc_end0:
.cfi_endproc
উপরের দিকে, __ZmlIiiE7Vector3IDTmldtfp_1xdtfp0_1xEERKS0_IT_ERKS0_IT0_E
আপনার operator*()
ফাংশনটি হয় এবং callq
অন্য __…Vector3…
ফাংশনটি শেষ করে । এটি যথেষ্ট সমাবেশ সমাবেশ। সঙ্গে সংকলন -O1
প্রায় একই, এখনও __…Vector3…
ফাংশন কল ।
যাইহোক, যখন আমরা এটা আপ আচমকা -O2
, callq
গুলি __…Vector3…
অদৃশ্য, একটি দিয়ে প্রতিস্থাপিত imull
নির্দেশ ( * a.z
≈ * 3
), একটি addl
নির্দেশ ( * a.y
≈ * 2
), এবং মাত্র ব্যবহার b.x
মান সোজা-আপ (কারণ * a.x
≈ * 1
)।
.section __TEXT,__text,regular,pure_instructions
.globl _main
.align 4, 0x90
_main: ## @main
Lfunc_begin0:
.loc 6 30 0 ## main.cpp:30:0
.cfi_startproc
## BB#0:
pushq %rbp
Ltmp0:
.cfi_def_cfa_offset 16
Ltmp1:
.cfi_offset %rbp, -16
movq %rsp, %rbp
Ltmp2:
.cfi_def_cfa_register %rbp
.loc 6 33 2 prologue_end ## main.cpp:33:2
Ltmp3:
pushq %rbx
subq $24, %rsp
Ltmp4:
.cfi_offset %rbx, -24
##DEBUG_VALUE: main:argc <- EDI
##DEBUG_VALUE: main:argv <- RSI
leaq L_.str(%rip), %rbx
leaq -24(%rbp), %rsi
Ltmp5:
##DEBUG_VALUE: operator*=<int, int>:rhs <- [RSI+0]
##DEBUG_VALUE: operator*<int, int>:rhs <- [RSI+0]
##DEBUG_VALUE: main:b <- [RSI+0]
xorl %eax, %eax
movq %rbx, %rdi
Ltmp6:
callq _scanf
.loc 6 34 17 ## main.cpp:34:17
leaq -20(%rbp), %rsi
Ltmp7:
xorl %eax, %eax
.loc 6 34 2 is_stmt 0 ## main.cpp:34:2
movq %rbx, %rdi
callq _scanf
.loc 6 35 17 is_stmt 1 ## main.cpp:35:17
leaq -16(%rbp), %rsi
xorl %eax, %eax
.loc 6 35 2 is_stmt 0 ## main.cpp:35:2
movq %rbx, %rdi
callq _scanf
.loc 6 22 18 is_stmt 1 ## main.cpp:22:18
Ltmp8:
movl -24(%rbp), %esi
.loc 6 23 18 ## main.cpp:23:18
movl -20(%rbp), %edx
.loc 6 23 11 is_stmt 0 ## main.cpp:23:11
addl %edx, %edx
.loc 6 24 11 is_stmt 1 ## main.cpp:24:11
imull $3, -16(%rbp), %ecx
Ltmp9:
##DEBUG_VALUE: main:c [bit_piece offset=64 size=32] <- ECX
.loc 6 39 2 ## main.cpp:39:2
leaq L_.str1(%rip), %rdi
xorl %eax, %eax
callq _printf
xorl %eax, %eax
.loc 6 41 5 ## main.cpp:41:5
addq $24, %rsp
popq %rbx
popq %rbp
retq
Ltmp10:
Lfunc_end0:
.cfi_endproc
এই কোডটি, সমাবেশ এ -O2
, -O3
, -Os
, & -Ofast
সব বর্ণন অভিন্ন।