2016-09-21 63 views
0

考慮以下代碼:填充在彩車的結構

struct Foo { 
    float a, b; 
}; 

void bar(float array[2]) { 
    ... // read array[0] and array[1] 
} 

int main() { 
    Foo foo; 
    bar(&foo.a); 
} 

這段代碼安全嗎?也就是說,bar總是訪問foo.afoo.b?由於填充可能正在發生,所以對我來說似乎並不安全,但我不知道是否可以假設填充爲0,因爲abfloat

+0

這是未定義行爲。如果你重視你的同事的友誼和尊重,避免。 –

+0

你能指點我一些文檔/標準嗎? – ChronoTrigger

+0

https://isocpp.org/std/the-standard –

回答

1

它或多或少是安全的,因爲沒有任何技術原因使結構中的浮點數與數組中的排列方式不同。但是,這樣的代碼很難理解:使用相同內存作爲不同類型的技巧迫使您思考和分散代碼中的基本事物。而且這樣做真的很少需要。所以最好避免這種技巧。

如果我沒有記錯沒有官方保證,這樣的代碼將工作,所以如果你想要絕對安全的,你需要這樣的代碼,那麼你可以添加一個static_assert:

static_assert(offsetof(Foo, b) - offsetof(Foo, a) == sizeof(float)); 
+1

不需要檢查偏移量,因爲ChronoTrigger使用地址而不是結構地址來調用條。 –