我定义一个如下的结构体:
type TQqhrOndutyOxtRe =Record
ConNo:String[4];
Ktype:String[3];
StartDateTime:TDateTime;
EndDateTime:TDateTime;
Qd:Byte;
StationNo:Byte;
StartGlb:Double;
EndGlb:Double;
Driect:String[7];
Limit:Byte;
end;然我在使用时,发现以下问题:
变量: QqhrOndutyOxtRe:TQqhrOndutyOxtRe;
ShowMessage(IntToStr(Sizeof(QqhrOndutyOxtRe))); 这个显示是字节数是72
i:=0;
i:=i+Sizeof(QqhrOndutyOxtRe.ConNo);
i:=i+Sizeof(QqhrOndutyOxtRe.Ktype);
i:=i+Sizeof(QqhrOndutyOxtRe.StartDateTime);
i:=i+Sizeof(QqhrOndutyOxtRe.EndDateTime);
i:=i+Sizeof(QqhrOndutyOxtRe.Qd);
i:=i+Sizeof(QqhrOndutyOxtRe.StationNo);
i:=i+Sizeof(QqhrOndutyOxtRe.StartGlb);
i:=i+Sizeof(QqhrOndutyOxtRe.EndGlb);
i:=i+Sizeof(QqhrOndutyOxtRe.Driect);
i:=i+Sizeof(QqhrOndutyOxtRe.Limit);
ShowMessage(IntToStr(i)); 这个是全部分量字节数相加是52,
而实际定义的结构体字体总数也应该是52,而不应是72,不知道为什么,那位老大能回答呢?
在线急等.
type TQqhrOndutyOxtRe =Record
ConNo:String[4];
Ktype:String[3];
StartDateTime:TDateTime;
EndDateTime:TDateTime;
Qd:Byte;
StationNo:Byte;
StartGlb:Double;
EndGlb:Double;
Driect:String[7];
Limit:Byte;
end;然我在使用时,发现以下问题:
变量: QqhrOndutyOxtRe:TQqhrOndutyOxtRe;
ShowMessage(IntToStr(Sizeof(QqhrOndutyOxtRe))); 这个显示是字节数是72
i:=0;
i:=i+Sizeof(QqhrOndutyOxtRe.ConNo);
i:=i+Sizeof(QqhrOndutyOxtRe.Ktype);
i:=i+Sizeof(QqhrOndutyOxtRe.StartDateTime);
i:=i+Sizeof(QqhrOndutyOxtRe.EndDateTime);
i:=i+Sizeof(QqhrOndutyOxtRe.Qd);
i:=i+Sizeof(QqhrOndutyOxtRe.StationNo);
i:=i+Sizeof(QqhrOndutyOxtRe.StartGlb);
i:=i+Sizeof(QqhrOndutyOxtRe.EndGlb);
i:=i+Sizeof(QqhrOndutyOxtRe.Driect);
i:=i+Sizeof(QqhrOndutyOxtRe.Limit);
ShowMessage(IntToStr(i)); 这个是全部分量字节数相加是52,
而实际定义的结构体字体总数也应该是52,而不应是72,不知道为什么,那位老大能回答呢?
在线急等.
Ktype:String[3];
Driect:String[7];
问题出在他们的身上 不信你把记录写进文件看一下就明白了
这是编译器优化的结果将不同长度的变量统一空间这样查找起来速度快定义这么多看着头晕,你定义两个看看就明白了type
AAA=record
b:btye;
i:integer;
end;显示一下看看,AAA的大小是8,给b也分配了4个空间
但是size(b)=1
如果是C++里的话,一般都会对这种结构进行按4字节的对齐
以加快内存的加载速度
delphi的内存结构不是很清楚
如果是C++里的话,一般都会对这种结构进行按4字节的对齐
以加快内存的加载速度
不一定是4字节,根据最大的那个对齐
比如楼主例子里的double就是8字节 :)
不进行对齐
对齐,哈,这个词好俺前面说了半天,不如这两个字传神
ConNo:String[4];
Ktype:String[3];
StartDateTime:TDateTime;
EndDateTime:TDateTime;
Qd:Byte;
StationNo:Byte;
StartGlb:Double;
EndGlb:Double;
Driect:String[7];
Limit:Byte;
end;
var
Form1: TForm1;implementation{$R *.dfm}procedure TForm1.Button1Click(Sender: TObject);
var test:TQqhrOndutyOxtRe;
begin
showmessage(IntToStr(sizeof(test)));
end;end.
///////////////////////////////////////////////////
////////////////如果用packed record就可以显示实际的大小了,而且你的String[X]不如改成用array[X] of Char;
但是我不赞成以上有些说法,结构体本来就是乱定义,只是类型要放在一起,这些我只是实验没有注意.
heluqing(鉴之小河〖挣大钱娶美女〗) 这位楼主的说法倒挺好. 还是非常谢谢各位.