dmd1.040中的sizeof的错误?
shawind
2009-02-28
具体的现象是这样的,简单的举个例子:
struct s { char[10] id; uint[50] pos; } 实际大小应该是210,但是s.sizeof的结果却是212. 莫名其妙的多出来2 不只是char类型,ubyte,byte也都有这个现象。 |
|
tomqyp
2009-02-28
这个是内存对齐方式的问题,C和C++也有这个情况。
话又说回来,以前看的时候没注意,D怎么指定对齐方式啊? |
|
llemmx
2009-02-28
D有显示的内存对齐方式如下:
struct HandleData{ //由于D的特性这里为兼容windows必须设置为4字节对齐模式 align(4)://这里设置对齐方式 WSAOVERLAPPED Overlapped;// 完成结构 ... } |
|
Colorful
2009-02-28
看来楼主需要恶补一番基础知识了,呵呵。
除了 struct ,union 还可以用 class 来体会一下。 import core.stdc.stdio; void main() { printf("%d\n", A.sizeof); printf("%d\n", __traits(classInstanceSize, A)); printf("%d\n", B.sizeof); printf("%d\n", __traits(classInstanceSize, B)); printf("%d\n", A.alignof); printf("%d\n", B.alignof); } class A { int a; } class B { int a; int b; } @tomqyp 请参见http://www.digitalmars.com/d/2.0/attribute.html#align |
|
shawind
2009-02-28
哦,要自己手动对齐一下。怪不得看别人代码都这么干呢。
我这个编程是自学的,基础不牢也是必然的。 多谢各位达人的指点! |
|
tomqyp
2009-02-28
|
|
hqs7636
2009-03-01
俺看书比较仔细,以前看到“对齐”不懂是啥意思,今天又看到了“内存对齐”,还是不懂啥意思
|
|
Colorful
2009-03-01
hqs7636 写道 俺看书比较仔细,以前看到“对齐”不懂是啥意思,今天又看到了“内存对齐”,还是不懂啥意思
这个解释起来比较麻烦,需要牵涉到很多计算机硬件架构的内容。 一两句说不清楚,你可以阅读一下《深入理解计算机系统》。 对齐的主要目的是为了提升性能,但是很多时候按照默认的对齐方式会浪费 CPU 缓存空间,反而可能降低性能,所以需要手动对齐。 比如常用的 4 字节对齐方式在 32 bit CPU 上经常可以提升性能,但是在 64 bit CPU 就不一定了。 CPU & Memory 架构决定了对齐的方式。 |
|
hqs7636
2009-03-01
感谢Colorful兄
找找去 |
|
RednaxelaFX
2009-03-04
Colorful 写道 hqs7636 写道 俺看书比较仔细,以前看到“对齐”不懂是啥意思,今天又看到了“内存对齐”,还是不懂啥意思
这个解释起来比较麻烦,需要牵涉到很多计算机硬件架构的内容。 一两句说不清楚,你可以阅读一下《深入理解计算机系统》。 对齐的主要目的是为了提升性能,但是很多时候按照默认的对齐方式会浪费 CPU 缓存空间,反而可能降低性能,所以需要手动对齐。 比如常用的 4 字节对齐方式在 32 bit CPU 上经常可以提升性能,但是在 64 bit CPU 就不一定了。 CPU & Memory 架构决定了对齐的方式。 alignment的主要目的是提升性能,因为指令只能按照固定宽度来读取/存储数据,并且其中有些高效些;不过我没见到不按照默认对齐的时候能带来性能提升的实例,Colorful兄有例子么? 像是VC在x86上如果给pragma pack来指定默认以外的对齐方式的话,编译出来的代码里经常会看到多了很多位移和and/or/xor操作;执行这些操作也是需要在寄存器里来回倒腾的,很难想像出多了这些操作后性能仍有提高的状况。所以求一下实例来看看…… |