【发布时间】:2013-01-22 04:51:24
【问题描述】:
如果我有这样的对象:
struct {
uint32_t n;
uint8_t c;
} blob {};
那么将有 3 个“填充”字节。
访问填充字节是 UB 吗?例如:
uint8_t * data = reinterpret_cast<uint8_t*>(&blob);
std::cout << data[4] << data[5] << data[6] << data[7];
我首先假设这可能是 UB,但如果这是真的,那么 memcpy 也将是 UB:
memcpy(buf, &blob, sizeof(blob));
我的具体问题是:
- 访问填充字节是 UB 吗?
- 如果不是,那是否意味着也定义了值?
【问题讨论】:
-
由于这是一个非常规矩的问题,我不确定最终的答案是什么。我怀疑它会被定义(只要 uint8_t* 是 unsigned char*),但初始值将保持未指定,就像任何其他未初始化的成员变量一样。现在,如果你想要规范引用,我把它留给有更多时间查找的人:)
-
我假设
uint32_t与sizeof(uint32_t)对齐。 -
@PeterG: 标准要求
sizeof(blob)至少为5。由于uint8_t存在,因此CHAR_BIT == 8和sizeof(uint32_t) == 4存在。然后,sizeof(blob)是 5 还是 8 是对齐问题。允许故意将其设置为 6 或 7。 -
@PeterG。如果
sizeof(blob)包含uint32_t和uint8_t,它怎么可能是4 个字节?我可以看到 5 个字节,我可以看到 8 个字节。但是4?怎么样? -
@SteveJessop 我认为他的意思是在
4 + 1 = 4的系统上,您不能指望任何东西都可以很好地定义。
标签: c++ alignment language-lawyer