4

any_t是任何类型 ( int, struct something, ...)。

考虑这个结构:

struct my_struct {
    any_t val,
    any_t array[10]
}

如果我定义一个变量v

struct my_struct v;

&v.val用作 11 个项目的数组是否安全any_t

any_t *p = &v.val;
f(p[0]);
f(p[5]);
f(p[10]);

是否保证不会在val和之间添加填充array

4

3 回答 3

7

&v.val仅从 C 标准来看,使用11 的数组是不安全的,any_t原因如下:

  • C 标准允许在结构中使用未命名的内部填充:C 2011 (N1570) 6.7.2.1 15,“结构对象中可能有未命名的填充,但不是在其开头。” C 实现在valand之间插入填充是不寻常的array,因为对齐要求不需要它,但它是允许的,并且在某些情况下它可能是有益的,例如导致array更好地对齐以提高性能(而不是必要)。
  • 即使保证valarray元素的间距与 11 的数组相同any_t,也不能保证指针算术有效。C 2011 (N1570) 6.5.6 8 定义了指针算术(包括数组索引),并且它只要求算术在数组中工作(包括末尾的一个名义元素)。一些 C 实现使用基址和偏移寻址。在这种情况下, 的基地址val可能无法支持扩展到array.
  • 即使 C 实现使用简单的平面寻址,它的优化器也可以根据 C 标准进行推导。理论上,优化器可以看到指针是从 的地址派生的val,因此不能(根据 C 标准)用于寻址array. 例如,如果您这样做any_t *p = &v.val; p[i] = 3; v.array[j] = 4;了,优化器可能会将分配到v.array[j]p[i]视为独立的并以任何顺序执行它们,即使您可能已经设置ij以便它们指向相同的元素。
于 2013-07-22T13:33:06.730 回答
1

不,标准没有任何保证。但是,您的特定编译器实现肯定会做出超出标准的保证。检查您的文档以获取所有详细信息。

于 2013-07-22T13:12:45.427 回答
0

好吧,您对结构的定义大约是 2 个字段,因此您的编译器可能不会将其用作 11 个元素的数组,因此您必须在文件被清除时填写它们。

于 2013-07-22T13:16:20.010 回答