2015-05-13 6 views
6

varsayalım I have a std::tuple: sadece t.get<int>(0) kullanarakGCC optimize std :: bağı sadece okunabilirlik için kullanılır mı?

int a, b, c, d; // in real context these names would be meaningful 
std::tie(a, b, c, d) = t; 

vs vs

Benim bir GCC: Ben sadece böyle okunabilirliği amaçla std::tie kullanmak istediğiniz

std::tuple<int,int,int,int> t = {1,2,3,4}; 

ve Bu tuple'nın bellek kullanımını optimize eder veya a, b, c, d değişkenleri için ek alan ayırır mı?

+4

neden denemiyorsunuz? (btw, bu muhtemelen olurdu.) –

+0

İlgili [Temp değişkenler programımı yavaşlatır mı?] (http://stackoverflow.com/q/26949569/1708801) –

+1

[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

cevap

7

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.

+1

Godbolt örneklerini paylaşabileceğinizi bilmiyordum. İşte [benim] (https://goo.gl/ilaeZg). – Barry

+1

@Barry yeni bir şeyler öğrendiğinize sevindim, bunun önemli bir özellik olduğunu hissediyorum, bunun gibi örnekleri paylaşamayacağımı çok daha az yararlı kılacak.Bu, SO hakkında harika olan şey, her zaman yeni bir şey öğrenmek. –

+0

Cevabınızdaki en önemli bilgilerin son paragraf olduğunu hissediyorum. – bolov

İlgili konular