包含数组的类的大小是否有保证?

发布于 2024-09-17 11:44:43 字数 163 浏览 11 评论 0原文

给定:

template <int N>
struct val2size
{
    char placeholder[N];
};

是否可以保证 sizeof(val2size) == N

Given:

template <int N>
struct val2size
{
    char placeholder[N];
};

Is there any guarantee that sizeof(val2size<N>) == N?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

笨死的猪 2024-09-24 11:44:43

唯一的保证是

sizeof(val2size<N>) >= N

结构末尾可能有未命名的填充。我认为不太可能会有未命名的填充,但这是有可能的。

The only guarantee is that

sizeof(val2size<N>) >= N

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.

旧梦荧光笔 2024-09-24 11:44:43

不,詹姆斯涵盖了。但是您可以通过以下方式获得您想要的内容:

template <std::size_t N> // not an int, a negative value doesn't make sense
struct value_to_size
{
    typedef char type[N];
};

sizeof(value_to_size::type) 保证为 N。 (这个技巧可用于进行 编译-时间数组大小实用程序。)

No, James covers that. But you can get what you want with:

template <std::size_t N> // not an int, a negative value doesn't make sense
struct value_to_size
{
    typedef char type[N];
};

sizeof(value_to_size<N>::type) is guaranteed to be N. (This trick can be used to make a compile-time size-of array utility.)

叹梦 2024-09-24 11:44:43

默认情况下,由于可能存在填充,因此无法保证。然而,许多编译器(至少 VC++ 和 gcc)允许您使用编译指示设置结构的对齐方式,如下所示:

#pragma pack(push, 1)
template <int N>
struct val2size
{
    char placeholder[N];
};
#pragma pack(pop)

将对齐方式设置为 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:

#pragma pack(push, 1)
template <int N>
struct val2size
{
    char placeholder[N];
};
#pragma pack(pop)

Setting the alignment to 1 essentially prevents any additional padding at the end of the structure.

兮子 2024-09-24 11:44:43

这实际上取决于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.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文