这是使堆栈缓冲区八字节对齐的可移植方法吗?

2023-12-30

struct {
  uint64_t a; char z[120];
} b;

...

struct buffer_with_alignment_requirement* c = (struct buffer_w*)&b;
c->start_using_it;

没有第一个成员a,当访问缓冲区中的字段时,我们可能会崩溃。简单地添加这样的成员来强制整个结构的对齐足够严格是否可移植且正确?

这不是一个关于指针别名的问题,只是关于地址是否b堆栈上始终是八字节对齐的。


精确宽度整数类型(如果存在)(7.20.1.1p3)没有任何特定的对齐要求,除了它们应该至少与char并且不比max_align_t(6.2.8p2-4)。甚至没有任何要求对齐方式应遵循整数转换等级,当然相应的有符号和无符号类型应具有相同的对齐方式(6.2.5p6)。

如果您想要特定的对齐方式,请使用对齐说明符:

#include <stdalign.h>
struct alignas(8) {
  char z[120];
} b;

但是,大概考虑到您对访问字段的描述,您actually想要的是将缓冲区对齐到缓冲区中可能存在的最对齐的类型。为此,C11 提供了max_align_t;在较旧的编译器中,您可以模拟max_align_t使用标准类型的联合:

typedef union {
  char c;
  short s;
  int i;
  long l;
  long long ll;  // if available
  float f;
  double d;
  long double ld;  // if available
  void *p;
  void (*fun)();
} max_align_t;
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

这是使堆栈缓冲区八字节对齐的可移植方法吗? 的相关文章

随机推荐