假设我有2个结构:
struct Foo
{
int size; // 4
int type; // 4
char data; // 1
};
static const struct Foo FooContainer[] = {
{1, 2, 3},
{4, 5, 6},
...
};
如果我使用类似的东西:
int structsincontainer = sizeof(FooContainer) / sizeof(struct Foo);
我是否总能在容器中获得正确数量的结构?我假设因为填充已经在struct Foos中完成,容器将不需要任何填充?
答案 0 :(得分:4)
FooContainer
是一个数组。 C和C ++中的数组保证不在它们的元素之间添加填充。任何可能存在的填充只是元素对象类型本身内部的填充。
所以是的,sizeof
技巧是一种常用技术,只要sizeof
的参数确实是数组的名称,而不是通过数组到指针的转换。
说了这么多,因为你标记了C ++,试着避免使用原始数组。 C ++标准库有几种替代方案可以提供更高的安全性和更多的功能。
即使你使用原始数组,在类型系统本身的帮助下,获得C ++大小的更好方法是:
template<typename T, std::size_t N>
constexpr auto array_size(T(&)[N]) { return N; }
以上内容非常容易使用int structsincontainer = array_size(FooContainer);
,只接受数组引用,而不是偶然传递指针时静默构建。
答案 1 :(得分:1)
这是对的。填充已在sizeof(struct foo)
中考虑。
通常,对于任何数组T arr[n];
(其中T
是任何类型),sizeof arr == (n * sizeof(T))
。这是由语言保证的。