我有一个用于保存4D向量的结构
struct { float x; float y; float z; float w; } vector4f
我正在使用一个库,它有一些函数可以在向量上运行,但是以浮点指针作为参数.
打电话是否合法doSomethingWithVectors( (float *) &myVector)
?
它可能有效,但它不可移植,编译器可以自由地对齐事物,以便一个浮点数不会立即跟随另一个浮点数.
您可以编写将尝试将其视为数组的代码,但该语言不保证该代码的功能.行为未定义.
在C语言中,将一个类型的值占用的存储区域重新解释为另一种类型几乎总是非法的.该规则有一些例外(这就是为什么我说"几乎"),就像你可以将任何对象重新解释为char数组一样,但一般来说它显然是非法的.
此外,可能的危险并不仅仅是理论上的,而且不仅仅是阵列和结构之间可能的对齐差异.现代编译器可能(并且确实)依赖上述语言规则来执行别名优化(例如,在GCC中读取严格别名语义).简而言之,允许编译器在假设一个内存占用的struct
内存永远不会重叠由数组占用的内存的情况下翻译代码float
.当人们开始使用帖子中的技巧时,这通常会导致意外结果.
哇.有很多答案说它会起作用.C标准不保证.在回应评论要求一个真实世界的例子,就是有优良的岗位由克里斯托雷克从comp.lang.c
.最后的引用是:这里的教训与以往一样:"如果你对编译器说谎,它就会报复."
绝对必须阅读那些认为将struct
同构成员视为数组的人.