我已经在C程序中初始化了一个 struct ,并将其附加到共享内存.其 struct 如下:
#define DrvMaxTag 1024
#define DrvMaxStr 128
#define StructLEN 32
typedef struct TagTypeStruct
{
unsigned char IO;
unsigned char Drv;
unsigned char Class;
unsigned char Group;
}TagTypeStruct;
typedef struct IEC_DT
{
long int tv_Sec;
long int tv_nSec;
}IEC_DT;
typedef struct DrvSHMTagStruct
{
char TagName[DrvMaxTag][DrvMaxStr];
double TagValue[DrvMaxTag];
double OldValue[DrvMaxTag];
unsigned int TagStatus[DrvMaxTag];
unsigned int OldStatus[DrvMaxTag];
long long TagControl[DrvMaxTag];
IEC_DT TagValueDT[DrvMaxTag];
TagTypeStruct TagType[DrvMaxTag];
int DrvAddr[DrvMaxTag];
unsigned char LogFlag[DrvMaxTag];
unsigned char Freeze[DrvMaxTag];
int LogicState;
char DrvPath[DrvMaxStr];
int TagQuantity;
unsigned char Instance;
}DrvSHMTagStruct;
我正在try 从另一个用Golang编写的程序中读取 struct .我已经计算了每个字段在C中占用多少字节,并且在我的Golang struct 中有一个等价的字段,如下所示:
const StructLEN = 32
const DrvMaxTag = 1024
const DrvMaxStr = 128
type TagTypeStruct struct {
IO uint8
Drv uint8
Class uint8
Group uint8
}
type IEC_DT struct {
tv_Sec int32
tv_nSec int32
}
type DrvSHMTagStruct struct {
TagName [DrvMaxTag][DrvMaxStr]byte
TagValue [DrvMaxTag]float64
OldValue [DrvMaxTag]float64
TagStatus [DrvMaxTag]uint32
OldStatus [DrvMaxTag]uint32
TagControl [DrvMaxTag]int64
TagValueDT [DrvMaxTag]IEC_DT
TagType [DrvMaxTag]TagTypeStruct
DrvAddr [DrvMaxTag]int32
RetainFlag [DrvMaxTag]uint8
Freeze [DrvMaxTag]uint8
LogicState int32
DrvPath [DrvMaxStr]uint8
TagQuantity int32
Instance uint8
}
C中的 struct (DrvSHMTagStruct)的大小是182416,Golang是182412(我的操作系统是基于ARM的).为什么会有区别呢?它们在4个字节中是不同的,有趣的是它们都能完美地工作,在同一个 struct 上读取和写入,没有错误.
显然,我对它进行了搜索,我了解到C编译器在编译过程中执行了大约Data Structure alignment次.因此,有4个字节的差异.但问题是,Golang程序如何正确地从共享内存中读取 struct ,即使它有4个字节的差异?
此外,当我在基于ARM的Linux上运行这些程序时,问题也出现了.在x64的Ubuntu上,它们的大小相同.