仅包含结构

时间:2018-02-01 06:24:55

标签: c++ c struct padding

假设我有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中完成,容器将不需要任何填充?

2 个答案:

答案 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))。这是由语言保证的。