标签:最大 cpp stream 对象 整数 div out void 还需
用例一:
#include<stdio.h> union ss { int a; char b; }; struct MyStruct { int temp1;//4个字节 char temp2;//一个字节,补齐3个字节 ss aa;//4个字节 char temp3;//一个字节 char temp4;//一个字节,补齐两个字节 }; int main() { printf("%d", sizeof(MyStruct)); return 0; }
输出 16
解析:对齐规则是按照成员的声明顺序,依次安排内存,对齐字节数为最大成员变量的字节大小,偏移量为最大成员变量的字节数的整数倍,在这个程序中对齐字节数为4,计算步骤如下:
首先是temp1 四个字节,temp2 一个字节,还剩3个字节,因为后面是aa 4个字节,可以自己对齐,所以temp2需要补齐3个字节, temp3 一个字节,temp4一个字节,对齐是4个字节,还剩2个字节需要补齐。所以总共是16个字节。
#include<stdio.h> union ss { int a; double b; }; struct MyStruct { int temp1;//4个字节 char temp2;//1个字节,对齐是8个字节,还需3个字节补齐 ss aa;//8个字节 char temp3;//1个字节 short temp4;//2个字节,补齐还需要5个字节 }; int main() { printf("%d", sizeof(MyStruct)); return 0; }
输出结果为 24
#include<stdio.h> union ss { int a; double b; }; struct student { int name; char sex; double num; }; struct MyStruct { int temp1;//4个字节 char temp2;//1一个字节,补齐3个字节 ss aa;//8个字节 char temp3;//一个字节 short temp4;//2个字节,补齐5个字节 student people;//16个字节 }; int main() { printf("%d", sizeof(MyStruct)); return 0; }
结果为 40
解析:此时需要注意的是,对齐字节数8个字节,而不是16个字节。student people 对象内部先进行一次对齐,然后如果如果是外面对齐字节数的整数倍就不需要
再进行对齐了,如果不是就需要再次进行对齐。
下面的是需要二次对齐的程序:
#include<stdio.h> struct MyStruct { char temp1; char temp2; }; struct student { int name;//4个字节 char sex;//1个字节 MyStruct aa;//2个字节 char temp;//1个字节 }; int main() { printf("%d", sizeof(student)); }
输出为 8
#include<stdio.h> union ss { int a; double b; }; struct student { //int name; //char sex; int num; }; struct MyStruct { int temp1;//4个字节 char temp2;//1一个字节,补齐3个字节 ss aa;//8个字节 char temp3;//1个字节 short temp4;//2个字节 student people;//4个字节,补齐一个字节 }; int main() { printf("%d", sizeof(MyStruct)); return 0; }
输出结果为:24
总结,在一个结构体中有另一个结构体的对象时,对齐字节数与这个结构体对象的字节数无关,只与结构体中的成员变量和union 有关。
类的内存大小的计算:
#include<iostream> using namespace std; class student { public: student() { cout << "构造函数" << endl; } //void fun(); }; int main() { cout << sizeof(student) << endl; return 0; }
运行结果: 1
解析:如果是空类也会输出1。如果一个类只含有成员函数没有成员变量或者虚函数,类的大小都是1。如果含有静态成员变量或者是静态成员函数,也会是1,因为静态成员变量和静态成员函数是类的所有对象共享的,它并不存放在一个实例化对象中
为什么空类也会是1呢?
所谓类的实例化就是在内存中分配一块地址,每一个实例在内存中都有独一无二的地址,而了到达这个效果,编译器往往会给一个空类隐含的增加一个字节,这样实例化出来的每一个空类的对象都会得到一个独一无二的地址。如果空类的大小是0的话,那么实例化出来的所有空类对象都是在同样一个内存地址上,就相当于同一个对象,这不是我们想要的。
标签:最大 cpp stream 对象 整数 div out void 还需
原文地址:https://www.cnblogs.com/wuyepeng/p/9862144.html