Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/flash/4.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++ 参考结构大小的更好方法(#pragma pack VS defined size)_C++_Struct - Fatal编程技术网

C++ 参考结构大小的更好方法(#pragma pack VS defined size)

C++ 参考结构大小的更好方法(#pragma pack VS defined size),c++,struct,C++,Struct,假设我有结构Foo struct Foo{ int a; short b; char c; }; 我必须把这个结构写入n/w缓冲区。我需要知道这个结构的大小。 在我的环境中,sizeof(Foo)返回8,这没关系,我理解 这是两种表示我要写入缓冲区的确切大小的方法 1.#定义SIZEOF_FOO 7,并使用它代替SIZEOF(FOO) 2.通过使用#pragma pack,我可以使用sizeof(Foo),它将返回7 哪种方法更好,或者还有其他方法吗?指令修改了遵循该

假设我有结构Foo

struct Foo{
    int a;
    short b;
    char  c;
};
我必须把这个结构写入n/w缓冲区。我需要知道这个结构的大小。 在我的环境中,sizeof(Foo)返回8,这没关系,我理解

这是两种表示我要写入缓冲区的确切大小的方法

1.
#定义SIZEOF_FOO 7
,并使用它代替
SIZEOF(FOO)

2.通过使用
#pragma pack
,我可以使用
sizeof(Foo)
,它将返回7

哪种方法更好,或者还有其他方法吗?

指令修改了遵循该指令的结构构件的当前对齐规则。因此,它会影响在pragma之后定义的结构的大小

你很可能不需要这个只要使用
sizeof(Foo)
就可以知道结构的大小。
不要编写pragmas,因为它们在某些特殊情况下使用

您可以查看这些链接以了解有关pragmas的详细信息:




这个问题被严重误导了。
Foo
的大小始终是
sizeof(Foo)
返回的值。不要假设,不要一厢情愿,使用
sizeof

事实上,我希望
sizeof(Foo)
为12,在4字节边界上对齐所有内容

无论哪种方式,好消息是
sizeof
在编译时得到解决,对性能绝对没有影响。所以,没有理由不使用它

#define SIZEOF_FOO (sizeof(Foo))

我建议通过顺序编写其成员来编写结构。例如,您可以使用boost序列化


这会将应用程序内存中的结构表示与用于传输的格式分开。

如果需要将此类结构写入网络,请使用协议框架或使用独立于结构布局定义的协议显式封送数据

根据二进制布局的不同,结构的细节可能会引起麻烦

我听说过关于和的好消息,但我都没用过

我处理过文档中定义的协议,并使用自定义封送处理例程根据该协议输出数据,或者使用IDL描述(这有点像一个带注释的C结构,用于驱动打包序列化/反序列化例程的代码生成器)

这样,无论编译器对结构做了什么,您(或协议框架)都可以控制填充的使用。请注意,如果您使用协议框架,通常需要在两端使用它(例如,如果另一个节点不在您的控制范围内或框架不支持的嵌入式设备,这可能是一个问题)。

\define SIZEOF_FOO 7
,而不使用
。\pragma pack
。原因是,当您调用
send
(或任何等效)函数传递结构类型的变量并将数据大小传递为
7
,send函数将只发送第一个
7
字节的数据,而当您在另一端收到此数据时,您肯定会在代码中弄乱很多东西

使用
#pragma pack
指令将更改结构成员的对齐方式,您肯定会通过网络传输节省一些字节的数据,但如果您从优化/性能角度考虑,这些字节可以忽略不计。尽管大多数应用程序(我已经看到)使用
#pragma pack
打包结构成员,但这完全取决于您的需求

使用
#define SIZEOF_FOO 7
的一个主要问题是,如果将代码移植到其他平台/体系结构,则结构的实际大小可能不相同(7字节),然后必须使用依赖于平台的宏或提出其他替代方案


因此,简而言之,您应该始终使用
sizeof
而不是使用
#define sizeof_FOO

您的意图是什么?在任何时候都要知道Foo的大小,或者强迫Foo的大小具有一定的值?实际上,sizeof(Foo)返回Foo的实际大小,而您对它的期望是7是错误的。必须将实际字节数写入缓冲区,而不是希望结构为的字节数。此外,使用任何常量都不能保证发送方和接收方的Foo大小相同。关键是接收方在不同的系统中,它希望前4个字节是“a”值,依此类推,接下来的2个字节是“b”,接下来的1个字节是c。当它在“c”之后添加关于写入大小8(从sizeof开始)而不是7的填充0时,问题就出现了。它破坏了缓冲流。只是好奇:你为什么期望它是9?我期望
sizeof(Foo)
是8,因为'short'和'char'将在4字节边界内容纳!起初我有12个,但因为我太蠢了,我把它减到了9个。我已将其编辑为12
结构Foo{char c;int a;short b;}。。也就是说,只要
inta
介于short和char之间,sizeof(Foo)就应该是12。“我已经将其编辑为12”。。。不,如果编译器足够聪明,它不会是12。请看我的其他评论!