2010-09-05 22 views
4

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

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

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

+1

您可以从'boost :: array '或C++ 0x'std :: array'获得相同的结果。 – Potatoswatter 2010-09-05 20:15:51

+0

请注意,大部分答案都假设你只说包含一个数组,而没有其他成员。那里的成员越多,对象的大小就越可能优于它们各自的大小之和。 – 2010-09-06 06:52:34

回答

6

唯一保证是

sizeof(val2size<N>) >= N 

可以是无名填充在该结构的端部。我不认为可能会有未命名的填充,但这是可能的。

+0

谢谢,所以我怀疑。假设实际上在任何平台上'sizeof(int)'是自然字的大小(不知道它是否被定义为这种方式,虽然)有一个填充的机会,如果它是一个int数组(大小然后是“ N * sizeof(int)')? – uj2 2010-09-05 20:07:15

+0

@ uj2:来自AMD64 ABI http://www.x86-64.org/documentation/abi.pdf“数组使用与其元素相同的对齐方式,除了长度至少为16字节的本地或全局数组变量或者一个C99变长数组变量总是有至少16个字节的对齐。“这听起来像一个数组*子对象*将免除这个,但很容易尝试看看。 – Potatoswatter 2010-09-05 20:18:37

+0

更一般地说,对于包含矢量类型的另一个ABI来说,扩展这样的需求是合理的。 – Potatoswatter 2010-09-05 20:25:03

3

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

sizeof(value_to_size<N>::type)保证是N。 (这个技巧可以用来制作一个compile-time size-of array utility。)

+0

太糟糕了我想使用'val2size'作为返回类型... – uj2 2010-09-05 20:09:14

+0

@ uj2:你的问题中没有任何内容说明返回类型的任何内容。为什么不问一个关于真正问题的真正问题,而不是一个步骤? – GManNickG 2010-09-05 20:12:02

+0

@ uj2:没有什么能阻止你使用'val2size'作为_return type_。但是,你想通过将类型等同于特定的值来实现什么?编译时间检查? – dirkgently 2010-09-05 20:18:27

0

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

1

默认情况下,由于可能的填充不能保证。然而,许多编译器(至少VC++和gcc)让你使用编译指示,像这样设置结构的取向:

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

设置对准到1基本上防止了任何额外的填充在该结构的端部。

+1

_Valid值为1,2,4,8和16.成员的对齐将位于n的倍数或成员大小倍数的边界上,以较小者为准._从http: //msdn.microsoft.com/en-us/library/2e70t5y1%28VS.80%29.aspx – dirkgently 2010-09-05 20:15:08

+0

感谢您指出这一点,我的意思是1.自从我使用它以来已经有一段时间了。 – casablanca 2010-09-05 20:17:42

相关问题