C++ 是否可以保证包含数组的类的大小?

C++ 是否可以保证包含数组的类的大小?,c++,arrays,metaprogramming,sizeof,C++,Arrays,Metaprogramming,Sizeof,鉴于: 模板 结构val2size { 字符占位符[N]; }; 是否有任何保证sizeof(val2size)==N?唯一的保证是 template <int N> struct val2size { char placeholder[N]; }; sizeof(val2size)>=N 结构末尾可能有未命名的填充。我不认为会有未命名的填充物,但这是可能的。没有。但你可以通过以下方式得到你想要的: sizeof(val2size<N>) >= N

鉴于:

模板
结构val2size
{
字符占位符[N];
};

是否有任何保证
sizeof(val2size)==N

唯一的保证是

template <int N>
struct val2size
{
    char placeholder[N];
};
sizeof(val2size)>=N
结构末尾可能有未命名的填充。我不认为会有未命名的填充物,但这是可能的。

没有。但你可以通过以下方式得到你想要的:

sizeof(val2size<N>) >= N
template//不是int,负值没有意义
结构值到大小
{
typedef字符类型[N];
};

sizeof(value-to-size::type)
保证为
N
。(这个技巧可以用来制作a。)

这取决于N的实际大小,以及N字符的大小是否适合世界对齐方式。如果字符数组的内存为“世界对齐”(32位为4字节对齐,64位为8字节对齐),则会得到sizeof==N,如果不是,则会添加填充以使分配给“世界对齐”的内存,在这种情况下,它将>=N。

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

template <std::size_t N> // not an int, a negative value doesn't make sense
struct value_to_size
{
    typedef char type[N];
};
#pragma包(推送,1)
模板
结构val2size
{
字符占位符[N];
};
#布拉格语包(流行语)

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

谢谢,所以我怀疑。假设在几乎任何平台上,
sizeof(int)
都是自然字长(但不确定是否定义为自然字长),如果是int数组(当时大小为
N*sizeof(int)
),是否有可能进行填充?@uj2:来自AMD64 ABI数组使用与其元素相同的对齐方式,但长度至少为16字节的本地或全局数组变量或C99可变长度数组变量的对齐方式始终至少为16字节。“听起来数组子对象将不受此限制,但很容易尝试和查看。更一般地说,包含向量类型的另一个ABI扩展此要求是合理的。@uj2:您的问题中没有任何关于返回类型的内容。为什么不就一个真正的问题而不是一个步骤问一个真正的问题呢?@uj2:没有什么能阻止你使用
val2size
作为返回类型。但是,通过将一个类型等同于一个特定的值,您试图实现什么呢?编译时检查?你是对的。这是一个局部的问题,尽管我觉得应该单独问。不过,该注释可能没有太大帮助,它是一个有效的答案。有效值为1、2、4、8和16。构件的对齐将位于n的倍数或构件尺寸的倍数(以较小者为准)的边界上。谢谢你指出这一点,我实际上是指1。我已经有一段时间没有使用它了。您可以从
boost::array
或C++0x
std::array
获得相同的结果。请注意,大多数答案都假设您所说的只是包含一个数组,而没有其他成员。成员越多,对象的大小就越可能优于其各自大小之和。
#pragma pack(push, 1)
template <int N>
struct val2size
{
    char placeholder[N];
};
#pragma pack(pop)