2016-09-21 62 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使用地址而不是结构地址来调用条。 –