2013-11-09 19 views
5

具有單個成員的struct是否具有與成員類型(內存使用率和速度)相同的性能?與單個成員的結構是否具有與成員類型相同的性能?

此代碼是一個struct具有單個部件:

struct my_int 
{ 
    int value; 
}; 

my_int相同int的表現?

+1

性能如何?你會如何使用它?一個普通的'int'變量?你有沒有嘗試過基準測試? –

+1

它使用它更打字,所以它在這個意義上「性能較差」。除此之外,請查看編譯器生成的程序集。 (和/或基準。) – Mat

+0

我猜OOTB值類型在某些方面進行了優化,但我認爲你甚至沒有注意到它們之間的差異。 –

回答

3

如果編譯器對使用結構體而不是單個變量有任何損失,則嚴格依賴於編譯器和編譯器選項。

但是沒有理由說明,當你的結構只包含一個成員時,編譯器應該做出任何區別。應該有額外的代碼來訪問成員,也不要去任何指向這樣的結構的指針。如果您沒有這種過度簡化的結構,並且一個成員可能會花費一個額外的CPU指令,具體取決於所使用的CPU。

5

同意@harper整體,但要注意以下幾點:

一個經典的差異被認爲是與「非結構化」陣列和在結構中的陣列。

char s1[1000]; 
// vs 
typedef struct { 
    char s2[1000]; 
} s_T; 
s_T s3; 

當調用函數...

void f1(char s[1000]); 
void f2(s_T s); 
void f3(s_T *s); 

// Significant performance difference is not expected. 
// In both, only an address is passed. 
f1(s1); 
f1(s3.s2); 

// Significant performance difference is expected. 
// In the second case, a copy of the entire structure is passed. 
// This style of parameter passing is usually frowned upon. 
f1(s1); 
f2(s3); 

// Significant performance difference is not expected. 
// In both, only an address is passed. 
f1(s1); 
f3(&s3); 
1

在某些情況下,ABI可能返回結構並將它們傳遞給函數的具體規則。例如,給定

struct S { int m; }; 
struct S f(int a, struct S b); 
int g(int a, S b); 

主叫fg或可以,例如,通過a在寄存器中,並且在堆棧上通過b。同樣,撥打g可能會使用寄存器作爲返回值,而呼叫f可能需要呼叫者設置一個位置,f將存儲其結果。

這種性能差異通常應該可以忽略不計,但是它可以產生顯着差異的一種情況是當這種差異啓用或禁用尾遞歸時。

假設g實施爲int g(int a, struct S b) { return g(a, b).m; }。現在,在一個實現方式,其中f的結果被返回相同的方式g的,這可以編譯成(從鐺實際輸出)

 
     .file "test.c" 
     .text 
     .globl g 
     .align 16, 0x90 
     .type g,@function 
g:          # @g 
     .cfi_startproc 
# BB#0: 
     jmp  f      # TAILCALL 
.Ltmp0: 
     .size g, .Ltmp0-g 
     .cfi_endproc 


     .section  ".note.GNU-stack","",@progbits 

然而,在其他實施方式中,這樣的尾呼叫是不可能的,所以如果你想爲深度遞歸函數獲得相同的結果,你真的需要給fg返回相同的類型,否則你可能會發生堆棧溢出。 (我知道,尾調用不授權。)

並不意味着intS快,也不意味着Sint更快,雖然。無論使用的是int還是S,只要使用相同的內存,內存使用情況將會類似。

相關問題