Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/146.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 避免在C+中使用结构填充+;_C++_Memory Management_Data Structures_Struct - Fatal编程技术网

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%以上。