Bu durumda, neden herhangi bir neden göremiyorum, as-if rule altında derleyici yalnızca programın gözlenebilir davranışını taklit etmelidir. Hızlı bir deney using godbolt:
#include <tuple>
#include <cstdio>
void func(int x1, int x2,int x3, int x4)
{
std::tuple<int,int,int,int> t{x1,x2,x3,x4};
int a, b, c, d; // in real context these names would be meaningful
std::tie(a, b, c, d) = t;
printf("%d %d %d %d\n", a, b, c, d) ;
}
gcc onu şüphesiz uzak optimize olmadığını göstermektedir:
func(int, int, int, int):
movl %ecx, %r8d
xorl %eax, %eax
movl %edx, %ecx
movl %esi, %edx
movl %edi, %esi
movl $.LC0, %edi
jmp printf
Öte yandan t
bir adres kullanmış ve bunu baskılı eğer, şimdi gözlemlenebilir davranışı hangi (see it live) mevcut t
dayanır:
printf("%p\n", static_cast<void*>(&t));
ve biz bu gcc artık t
uzakta optimize görebilirsiniz: sizi şaşırtabilir daha karmaşık durumlarda, derleyici oluşturur ne bakmak ve kodunuzun profilini gereken Günün sonunda
movl %esi, 12(%rsp)
leaq 16(%rsp), %rsi
movd 12(%rsp), %xmm1
movl %edi, 12(%rsp)
movl $.LC0, %edi
movd 12(%rsp), %xmm2
movl %ecx, 12(%rsp)
movd 12(%rsp), %xmm0
movl %edx, 12(%rsp)
movd 12(%rsp), %xmm3
punpckldq %xmm2, %xmm1
punpckldq %xmm3, %xmm0
punpcklqdq %xmm1, %xmm0
. Derleyicinin belirli optimizasyonları yapmasına izin verildiği için bunun yapacağı anlamına gelmez. Derleyicinin std::tuple
ile beklediğim şeyi yapmadığı daha karmaşık durumlara baktım. godbolt burada çok yardımcı bir araçtır, basit örneklerde godbolt'a takılarak kaç tane varsayım varsayımı yaptığımı tahmin edemiyorum.
Not: Bu örneklerde genellikle printf
kullanıyorum, çünkü iostreams örnek yolunda çok fazla kod üretiyor.
neden denemiyorsunuz? (btw, bu muhtemelen olurdu.) –
İlgili [Temp değişkenler programımı yavaşlatır mı?] (http://stackoverflow.com/q/26949569/1708801) –
[godbolt] 'a göz atın (https: //gcc.godbolt. org /). Kısa cevap: Basit bir örnek için evet. Bir tuple elemanlarının 'tie()' veya '()' ile toplanması aynı montajı üretir. –
Barry