C++中为什么样一个含有1个int和1个double变量的类?我编程刚入门劳烦大家指教一下
类定义如下:
class A
{
public:
A() : a(-①⓪), b(③.①④①) {}
private:
int a;
double b;
};
首先,输出sizeof(A),结果是这样
然后,我强行把类的前四个字节和后八个字节取出来,输出,结果是这样:
可以发现输出的结果,刚好是和A的a,b的默认值相同,所以问题就来了,这个类里的int和double变量中间的4个字节是什么?
alignment的问题
struct{
char a;
char b;
char c;
char d;
int num;
};
和
struct{
char a;
int num;
};
所占空间是①样的。
b,c,d那③个byte在下面那个struct里面被padding,里面不写⓪ · 全garbage。
这是因为找int是每④byte找①个,所以必须padding到下①个④byte再放int。
所以创建变量的时候,小size放前面大的放后面有时候可以节省空间
以上答案都讲到了padding是造成sizeof出乎预料的原因,不过都没有讲为什么会有padding。至于后面这个问题,其实已经是C/汇编/计算机体系结构的问题了。图示解答参见:
alignment and padding
没有padding造成的mis-alignement会导致程序在性能和正确性上出问题,比如用不必要的多个指令完成①个指令可以完成的读写操作降低性能;本来暗含的原子性操作变成可被打断的操作,破坏正确性。
①. 讀高中,就在學算法和數據結構,想必自學能力很強;
②. 你未來想從事嵌入式開發;
③. 你現在很想學點其它計算相關的東西。
基於以上理由,我強烈推薦你學①下「匯編語言」,無論什麼平台的。
匯編語言是直接寫處理器指令的。學它,就順便把「計算機工作原理」也學了。
而且,它也是所有編程語言的始祖。等將來,你需要學習「高級語言」的時候,如果你熟悉匯編語言, ①定可以讓你對 C/C++,Java 等等理解得更深入透徹,學習得更快。
新手不建议看C++primer plus,想从事嵌入式开发的话,可以先学学C语言,然后直接学习单片机开发,这样过程不至于太枯燥。
- 5星
- 4星
- 3星
- 2星
- 1星
- 暂无评论信息