包含数组的类的大小是否有保证?
给定:
template <int N>
struct val2size
{
char placeholder[N];
};
是否可以保证 sizeof(val2size
?
Given:
template <int N>
struct val2size
{
char placeholder[N];
};
Is there any guarantee that sizeof(val2size<N>) == N
?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(4)
唯一的保证是
结构末尾可能有未命名的填充。我认为不太可能会有未命名的填充,但这是有可能的。
The only guarantee is that
There may be unnamed padding at the end of the struct. I don't think it's likely that there will be unnamed padding, but it's possible.
不,詹姆斯涵盖了。但是您可以通过以下方式获得您想要的内容:
sizeof(value_to_size::type)
保证为N
。 (这个技巧可用于进行 编译-时间数组大小实用程序。)No, James covers that. But you can get what you want with:
sizeof(value_to_size<N>::type)
is guaranteed to beN
. (This trick can be used to make a compile-time size-of array utility.)默认情况下,由于可能存在填充,因此无法保证。然而,许多编译器(至少 VC++ 和 gcc)允许您使用编译指示设置结构的对齐方式,如下所示:
将对齐方式设置为 1 本质上可以防止结构末尾出现任何额外的填充。
By default, there is no guarantee because of possible padding. However, many compilers (at least VC++ and gcc) allow you to set the alignment of structures using a pragma, like this:
Setting the alignment to 1 essentially prevents any additional padding at the end of the structure.
这实际上取决于N的大小以及N个字符的大小是否可以以世界对齐的方式适合。如果字符数组的内存是世界对齐的(32 位为 4 字节对齐,64 位为 8 字节对齐),那么您将得到 sizeof==N,否则它将添加填充以使分配的内存成为世界对齐,在那种情况下它将≥N。
It depends on the size of N actually and whether that size of N char can be fit in a world align manner. If the memory of character array is world align ( 4 byte align for 32 bit and 8 byte align for 64 bit) then you will get sizeof==N or if not then it will add padding to make the memory allocated to be world align and in that case it will be >=N.