【问题标题】:Padding of Struct containing only structs [duplicate]仅包含结构的结构的填充[重复]
【发布时间】:2018-07-11 09:55:05
【问题描述】:

假设我有 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 个结构:" 你没有。您有 1 个结构和一个结构数组。不是“包含结构的结构”。

标签: c++ c struct padding


【解决方案1】:

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); 一样,并且只接受数组引用,而不是在意外传递指针时静默构建。

【讨论】:

  • 更好的是,从 c++17 开始就有一个用于数组和容器的 std::size。
【解决方案2】:

没错。 sizeof(struct foo) 中已经考虑了填充。

一般来说,对于任何数组T arr[n];(其中T 是任何类型),sizeof arr == (n * sizeof(T))。这是由语言保证的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-07-28
    • 1970-01-01
    • 2016-12-28
    • 1970-01-01
    • 1970-01-01
    • 2011-08-13
    • 2015-09-23
    相关资源
    最近更新 更多