gpt4 book ai didi

c++ - 结构包装。有没有自动的方法来做到这一点?

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:44:31 26 4
gpt4 key购买 nike

问题:是否有自动进行结构打包的方法?

背景:

Structure packing对于降低某些基本数据的内存成本非常有用。基本上,这是通过重新排序内部数据来实现最小内存成本的技巧。我的问题是有没有一种自动方法可以做到这一点?比如我这里有一个struct Foo(假设32bit)

struct Foo {     
char flag;
char* p;
short number;
};

经过自动检查(是否为脚本,是否为 native ),我应该得到 Foo 的内存优化版本,即:

struct Foo {
char* p;
short number;
char flag;
};

这只是一个玩具示例。考虑下面更困难的情况,手动重新排序将是一项相当大的工作。

  1. 结构有依赖结构:

    struct Foo {
    char* p;
    short number;
    MoreFoo more_foo // How to deal with this?
    char flag;
    };
  2. 结构在遗留代码中,您不熟悉代码库。

  3. 您希望代码是跨平台的。可悲的是,这个技巧依赖于编译器。

我不考虑使用“packed”属性,因为它会导致一些性能问题。

Can __attribute__((packed)) affect the performance of a program?

最佳答案

在 C++03 中,您可以通过将每个成员放在单独的访问部分中来授予编译器重新排序成员的权限,例如:

struct Foo
{
public:
char* p;
public:
short number;
public:
MoreFoo more_foo;
public:
char flag;
};

我不知道某个特定的编译器是否使用了这种额外的灵 active 。

这不会改变声明顺序,它只是取消内存顺序与声明顺序的链接,因此 PaulMcKenzie 对初始化顺序的担忧不适用。 (而且我认为他夸大了这个担忧;成员初始值设定项首先引用其他子对象的情况非常罕见)

它的工作方式是因为它导致以下规则,从 9.2) 不再有效:

Nonstatic data members of a (non-union) class declared without an intervening access-specifier are allocated so that later members have higher addresses within a class object. The order of allocation of nonstatic data members separated by an access-specifier is unspecified (11.1). Implementation alignment requirements might cause two adjacent members not to be allocated immediately after each other; so might requirements for space for managing virtual functions (10.3) and virtual base classes (10.1).

此外,这在 C++11 中是否仍然有效值得怀疑,因为措辞从“没有干预访问说明符”变为“具有相同的访问控制”:

Nonstatic data members of a (non-union) class with the same access control (Clause 11) are allocated so that later members have higher addresses within a class object. The order of allocation of non-static data members with different access control is unspecified (Clause 11). Implementation alignment requirements might cause two adjacent members not to be allocated immediately after each other; so might requirements for space for managing virtual functions (10.3) and virtual base classes (10.1).

关于c++ - 结构包装。有没有自动的方法来做到这一点?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27909254/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com