C 结构 : consecutive fields without padding?

标签 c struct padding

any_t 是任何类型(intstruct 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]);

是否保证valarray之间不添加填充?

最佳答案

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

  • C 标准允许结构中未命名的内部填充:C 2011 (N1570) 6.7.2.1 15,“结构对象中可能有未命名的填充,但不是在其开头。” C 实现在 valarray 之间插入填充是不寻常的,因为对齐要求不需要它,但它是允许的,并且可以想象它在某些情况下是有益的,例如使 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 以便它们指向相同的元素。

关于C 结构 : consecutive fields without padding?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17788420/

相关文章:

c - 发送数据包所需的最少数据量是多少?

html - 如何将p放在div的中心?

css - 如何使 4 个矩形框适合 bootstrap 3 中的屏幕?

c++ - 变量作为全局范围内的结构 - 如何定义?

c - 初始化作为结构数组索引的 C 结构

c++ - 如何声明一个 std::array of structs initialized inline with different values

css - ie7 css html 填充问题

c - 我如何在不实际使用 c 中的 union 的情况下建立一个 union ?

c - 指针和数据宽度不同时的指针间接

c - 收到的 IM-MSG 信号消息