private:
double d;
int x,y;
char ch;
int z;
}
如果查看此类的大小,会发现char ch的位直不同,大小也不同!
听说这是字节对齐?
那么对齐的原则是什么?
9 个解决方案
#1
缺省情况下, 长度为 2^n 的类型的成员,起始地址要为2^n的整数倍;
#2
我也想知道,挺好玩的。你怎么发现的?
#3
一次无意中发现的!
一次我在写一个测试程序的时候,发现这个东东!
一次我在写一个测试程序的时候,发现这个东东!
#4
那为什么
class myclass {
private:
char ch;
}
或
class myclass {
private:
char ch,a;
}
时长度又正常分别是1,2。
class myclass {
private:
char ch;
}
或
class myclass {
private:
char ch,a;
}
时长度又正常分别是1,2。
#5
楼主强呀,我就没发现这样的问题
又学到东西勒
又学到东西勒
#6
计算结构变量的大小就必须讨论数据对齐问题。为了CPU存取的速度最快(这同CPU取数操作有关,详细的介绍可以参考一些计算机原理方面的书),C++在处理数据时经常把结构变量中的成员的大小按照4或8的倍数计算,这就叫数据对齐(data alignment)。这样做可能会浪费一些内存,但理论上速度快了。当然这样的设置会在读写一些别的应用程序生成的数据文件或交换数据时带来不便。MS VC++中的对齐设定,有时候sizeof得到的与实际不等。一般在VC++中加上#pragma pack(n)的设定即可.或者如果要按字节存储,而不进行数据对齐,可以在Options对话框中修改Advanced compiler页中的Data alignment为按字节对齐。
#7
那么总结一下一句话了:
如果你在开发平台里设了字节对齐的话,编译器就按照它的上一个数据类型进行字节对节,
至于为什么就是计算机指令的问题了!
下面就是我乱想的了:
原来的计算机的指令周期都是很”长“,(相对现在来说)但是那时候的内存空间也是有限的,必须合理的利用内存空间的大小,而计算机的指令受脉冲的控制,它不可能在一个中断一个指令周期,(现在好像也是如此的),计算机控制中心会按照数据的实际长短控制,这时候的的脉冲频会不断的变换,这样才能向控制总结发出不同的控制信号!
而对于现在INNER MEMEORY 动不动就是几BMB来说,显然几KB不算是什么,这时候,计算机就会采服牺牲空间来换取时间了!同一频段的脉冲当然也要不短变换的脉冲强多了!
因此,就像上面所说的了!
如果你在开发平台里设了字节对齐的话,编译器就按照它的上一个数据类型进行字节对节,
至于为什么就是计算机指令的问题了!
下面就是我乱想的了:
原来的计算机的指令周期都是很”长“,(相对现在来说)但是那时候的内存空间也是有限的,必须合理的利用内存空间的大小,而计算机的指令受脉冲的控制,它不可能在一个中断一个指令周期,(现在好像也是如此的),计算机控制中心会按照数据的实际长短控制,这时候的的脉冲频会不断的变换,这样才能向控制总结发出不同的控制信号!
而对于现在INNER MEMEORY 动不动就是几BMB来说,显然几KB不算是什么,这时候,计算机就会采服牺牲空间来换取时间了!同一频段的脉冲当然也要不短变换的脉冲强多了!
因此,就像上面所说的了!
#8
在32位系统中,从ram中读数据都是一次读4个字节的,如果一个int型(32位)的地址不是4的倍数,则读这个int型时,要读2次,然后再分别移位,合并,这样速度就会慢很多。对于1字节的类型(如char)则怎么都要做移位的操作。对于2字节长的类型(如short),如果地址是2的倍数,则只要读一次,如果是奇数的话,也有可能要读两次,在移位,合并。
#9
看看这个贴子吧
http://expert.csdn.net/Expert/topicview.asp?id=2000453
http://expert.csdn.net/Expert/topicview.asp?id=2000453
#1
缺省情况下, 长度为 2^n 的类型的成员,起始地址要为2^n的整数倍;
#2
我也想知道,挺好玩的。你怎么发现的?
#3
一次无意中发现的!
一次我在写一个测试程序的时候,发现这个东东!
一次我在写一个测试程序的时候,发现这个东东!
#4
那为什么
class myclass {
private:
char ch;
}
或
class myclass {
private:
char ch,a;
}
时长度又正常分别是1,2。
class myclass {
private:
char ch;
}
或
class myclass {
private:
char ch,a;
}
时长度又正常分别是1,2。
#5
楼主强呀,我就没发现这样的问题
又学到东西勒
又学到东西勒
#6
计算结构变量的大小就必须讨论数据对齐问题。为了CPU存取的速度最快(这同CPU取数操作有关,详细的介绍可以参考一些计算机原理方面的书),C++在处理数据时经常把结构变量中的成员的大小按照4或8的倍数计算,这就叫数据对齐(data alignment)。这样做可能会浪费一些内存,但理论上速度快了。当然这样的设置会在读写一些别的应用程序生成的数据文件或交换数据时带来不便。MS VC++中的对齐设定,有时候sizeof得到的与实际不等。一般在VC++中加上#pragma pack(n)的设定即可.或者如果要按字节存储,而不进行数据对齐,可以在Options对话框中修改Advanced compiler页中的Data alignment为按字节对齐。
#7
那么总结一下一句话了:
如果你在开发平台里设了字节对齐的话,编译器就按照它的上一个数据类型进行字节对节,
至于为什么就是计算机指令的问题了!
下面就是我乱想的了:
原来的计算机的指令周期都是很”长“,(相对现在来说)但是那时候的内存空间也是有限的,必须合理的利用内存空间的大小,而计算机的指令受脉冲的控制,它不可能在一个中断一个指令周期,(现在好像也是如此的),计算机控制中心会按照数据的实际长短控制,这时候的的脉冲频会不断的变换,这样才能向控制总结发出不同的控制信号!
而对于现在INNER MEMEORY 动不动就是几BMB来说,显然几KB不算是什么,这时候,计算机就会采服牺牲空间来换取时间了!同一频段的脉冲当然也要不短变换的脉冲强多了!
因此,就像上面所说的了!
如果你在开发平台里设了字节对齐的话,编译器就按照它的上一个数据类型进行字节对节,
至于为什么就是计算机指令的问题了!
下面就是我乱想的了:
原来的计算机的指令周期都是很”长“,(相对现在来说)但是那时候的内存空间也是有限的,必须合理的利用内存空间的大小,而计算机的指令受脉冲的控制,它不可能在一个中断一个指令周期,(现在好像也是如此的),计算机控制中心会按照数据的实际长短控制,这时候的的脉冲频会不断的变换,这样才能向控制总结发出不同的控制信号!
而对于现在INNER MEMEORY 动不动就是几BMB来说,显然几KB不算是什么,这时候,计算机就会采服牺牲空间来换取时间了!同一频段的脉冲当然也要不短变换的脉冲强多了!
因此,就像上面所说的了!
#8
在32位系统中,从ram中读数据都是一次读4个字节的,如果一个int型(32位)的地址不是4的倍数,则读这个int型时,要读2次,然后再分别移位,合并,这样速度就会慢很多。对于1字节的类型(如char)则怎么都要做移位的操作。对于2字节长的类型(如short),如果地址是2的倍数,则只要读一次,如果是奇数的话,也有可能要读两次,在移位,合并。
#9
看看这个贴子吧
http://expert.csdn.net/Expert/topicview.asp?id=2000453
http://expert.csdn.net/Expert/topicview.asp?id=2000453