C++ 避免在C+中使用结构填充+;
在我的代码中,我有以下C++ 避免在C+中使用结构填充+;,c++,memory-management,data-structures,struct,C++,Memory Management,Data Structures,Struct,在我的代码中,我有以下struct: struct foo { int a; int b; }; 在b中,仅存储0到100之间的值。所以一般来说,我可以用char替换它。但是由于填充效应,struct的大小是相同的。由于我的代码包含这些结构的向量和集合,包含数百万个条目,如果我能以某种方式绕过填充,它将使内存使用量减少三分之一以上。是否有可能做到这一点,例如,其他(boost)数据容器的行为是否与此相同 编辑: 我在Linux系统上同时使用GNU和英特尔编译器:除了使用特殊的#pragma
struct
:
struct foo {
int a;
int b;
};
在b
中,仅存储0到100之间的值。所以一般来说,我可以用char
替换它。但是由于填充效应,struct
的大小是相同的。由于我的代码包含这些结构的向量
和集合
,包含数百万个条目,如果我能以某种方式绕过填充,它将使内存使用量减少三分之一以上。是否有可能做到这一点,例如,其他(boost)数据容器的行为是否与此相同
编辑:
我在Linux系统上同时使用GNU和英特尔编译器:除了使用特殊的
#pragma
s来控制结构填充/对齐外,您可以拆分a
和b
并将它们存储在单独的向量中,然后通过索引“匹配”它们
至于set
s,即使您可以轻松地将结构拆分为其组成部分(从纯逻辑的角度来看,set
s没有索引,这可能是不可能的),您仍然需要为动态内存管理对齐付费,这可能会抹去您在这方面可能获得的任何优势。将我的评论作为答案,正如社区建议的那样:)
这取决于编译器。您需要的是使用struct
pack
ing
对于Visual Studio,您需要#pragma pack
,对于gcc
,您需要使用属性packed
有关详细信息,请参阅
希望这有帮助,抱歉,我现在无法真正测试它,但这正是您需要的您需要一个结构
包
-ing。根据编译器的不同,您可以使用(可能是pragma pack
)告诉编译器不要添加填充。@Kiril为什么不添加填充作为答案?也许您可以将结构一分为二。您真的需要打包吗?大多数处理器使用本机大小(整数)比使用较小的大小更有效。此外,可能需要额外的处理时间来处理较小的尺寸;检查您的汇编代码。打包会为您节省大量内存空间吗?@ThomasMatthews:我做了一些基准测试:我的代码中处理这些数据的部分在打包数据时大约慢10%。但这部分只占整个运行时间的1%,因此额外的减速并不重要。但是,数据占代码内存使用量的30%以上。