【问题标题】:Is there a guarantee as to the size of a class that contains an array?是否可以保证包含数组的类的大小?
【发布时间】:2010-09-05 19:56:59
【问题描述】:

给定:

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

有没有保证sizeof(val2size&lt;N&gt;) == N

【问题讨论】:

  • 你可以从boost::array&lt;char,N&gt;或C++0x std::array得到同样的东西。
  • 请注意,大多数答案都假设您所说的仅包含一个数组,而没有其他成员。成员越多,对象的大小就越有可能优于它们各自大小的总和。

标签: c++ arrays metaprogramming sizeof


【解决方案1】:

唯一的保证就是

sizeof(val2size<N>) >= N

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

【讨论】:

  • 谢谢,所以我怀疑。假设在几乎任何平台上sizeof(int) 是自然字长(但不确定它是否被定义为这种方式),如果它是一个 int 数组(大小为N * sizeof(int)),是否有机会进行填充?
  • @uj2: 来自 AMD64 ABI x86-64.org/documentation/abi.pdf "数组使用与其元素相同的对齐方式,除了长度至少为 16 字节的局部或全局数组变量或 C99 可变长度数组变量始终具有至少 16 个字节的对齐方式。”听起来像数组 subobject 将不受此限制,但它很容易尝试和查看。
  • 更一般地说,包含向量类型的另一个 ABI 扩展这样的要求在某种程度上是合理的。
【解决方案2】:

不,James covers that。但是你可以得到你想要的:

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&lt;N&gt;::type) 保证为N。 (这个技巧可以用来制作compile-time size-of array utility。)

【讨论】:

  • @uj2:您的问题中没有任何关于返回类型的内容。为什么不就一个真正的问题而不是一个步骤提出一个真正的问题?
  • @uj2:没有什么能阻止你使用val2size 作为返回类型。但是,您想通过将类型等同于特定值来实现什么?编译时间检查?
  • 你是对的。这是一个片面的问题,虽然我觉得应该分开问。不过,评论可能并没有太大帮助,这是一个有效的答案。
【解决方案3】:

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

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

将对齐设置为 1 基本上可以防止结构末尾的任何额外填充。

【讨论】:

【解决方案4】:

这实际上取决于 N 的大小以及 N char 的大小是否可以以世界对齐的方式适应。如果字符数组的内存是世界对齐的(4 字节对齐 32 位和 8 字节对齐 64 位)然后你会得到 sizeof==N 或者如果不是那么它将添加填充以使分配的内存为世界对齐和在这种情况下,它将 >=N。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-07-10
    • 1970-01-01
    • 2021-04-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-02
    相关资源
    最近更新 更多