sizeof在编译不同的程序时返回结构的不同值

时间:2010-11-05 13:30:46

标签: c++ linux gcc shared-memory sizeof

我有两个共享头文件的程序。此头文件定义具有少量成员的结构。然后是#define:#define STRUCTURE_SIZE sizeof(OUR_STRUCTURE)

然后在共享内存中使用此结构,STRUCTURE_SIZE用于size的{​​{1}}参数。

不幸的是,对于一个程序,STRUCTURE_SIZE最终为20758,而在另一个程序中,它最终为20764.因此当第二个程序试图获取共享内存时,shmget()返回EINVAL。

shmget()

uname -a

Linux machine 2.6.30.10-105.2.23.fc11.i686.PAE #1 SMP Thu Feb 11 07:05:37 UTC 2010 i686 i686 i386 GNU/Linux

g++ --version

4 个答案:

答案 0 :(得分:13)

一些可能性:

  • 您正在使用不同的编译器和/或编译器开关编译这两个程序
  • 你有一个标题出现在其中一个程序中的标题之前,这与#pragma pack或类似的混淆并且不会恢复设置
  • 共享结构中使用的类型在两个程序中的定义不同

(注意:最后两点可以递归地应用于问题结构中使用的任何其他结构。)

答案 1 :(得分:2)

问题可能是打包或对齐问题。了解如何告诉编译器应该如何对齐结构。

答案 2 :(得分:2)

其他可能性:

  • 两个编辑中使用的定义集不同,结构在这些定义上有条件地定义
  • 某些类型在内核和用户空间中可以有不同的大小(这种情况很少见,但可能会发生)

答案 3 :(得分:2)

您可以通过编写一些代码来检查OUR_STRUCTURE中的字段偏移并打印出来,然后依次使用这两个编译来获得一些理解。细分总结构大小以确定每个字段引起的大小。

struct OUR_STRUCTURE
{
  double d;
  other_structure other;
  bool flag;
};

OUR_STRUCTURE ours;
cout << &ours.d - &ours << endl;
cout << &ours.other - &ours << endl;
cout << &ours.flag - &ours << endl;
cout << &ours + sizeof(OUR_STRUCTURE) - &ours.flag << endl;
相关问题