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
Colorful 写道

多谢Colorful兄
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操作;执行这些操作也是需要在寄存器里来回倒腾的,很难想像出多了这些操作后性能仍有提高的状况。所以求一下实例来看看……
Global site tag (gtag.js) - Google Analytics