Objective-C和c++中结构体的大小

Size of Structs in Objective-C and C++

本文关键字:结构体 c++ Objective-C      更新时间:2023-10-16

我正在将一些objective - c++代码转换为普通的Objective-C,我在结构体方面遇到了一些麻烦。对于这两种语言,我在.h文件中声明了这样的结构体。

struct BasicNIDSHeader {
    short messageCode;
    short messageDate;
    int messageTime;
    int messageLength;
    short sourceID;
    short destID;
    short numberOfBlocks;
};

在c++中,结构体声明为

BasicNIDSHeader header;

在Objective-C中我这样做

struct BasicNIDSHeader header;

使用它们的代码实际上在两种语言中是相同的。

memset(&header, 0, sizeof(header));
[[fileHandle readDataOfLength:sizeof(header)] getBytes:&header];

其中fileHandle是NSFileHandle。

问题是在原来的c++代码中,sizeof(header) = 18。当使用Objective-C时,sizeof(header) = 20.

知道为什么会发生这种情况或如何修复它吗?代码依赖于大小,就像在c++中一样。我可以只是硬编码它,但希望有一个更好的理解为什么它正在发生。而且我讨厌硬编码常量。

谢谢!

如果您依赖于您的struct s的内部内存结构-您应该禁用填充。这被称为"打包",不同的编译器有不同的方式来标记它。

在GCC中,您可以使用__attribute__关键字来完成此操作。细节。

我只能为c++发言。在c++中有一个特定的实现特性,它可以在特定的地址上对齐数据,以便有效地处理数据。

在MS Visual c++中,你可以使用一个pragma来强制字节对齐:

#pragma pack(1)