#include <iostream>
using namespace std;
int main()
{
struct S1
{
char a; //占8个,因为要和double对齐
double b; //占8个字节
};
cout << sizeof(S1) << endl; //16
/*内存地址排列方式
[00,01,02,03,04,05,06,07,08,09,10,11,12,13,14,15]
[ a,--,--,--,--,--,--,--,b______________________]
*/
struct S2
{
char a;
int b; //a和b总共占8个(因为1 + 4 = 5 小于sizeof(double)=8)要和double对齐.
double c; //占8个字节
};
cout << sizeof(S2) << endl; //16
/*内存地址排列方式
[00,01,02,03,04,05,06,07,08,09,10,11,12,13,14,15]
[ a,--,--,--,b__________,c______________________]
*/
struct S3
{
char a;
char d;
int b; //a,d和b总共占8个(因为1 + 1 + 4 = 6 小于sizeof(double)=8)要和double对齐.
double c; //占8个字节
};
cout << sizeof(S3) << endl; //16
/*内存地址排列方式
[00,01,02,03,04,05,06,07,08,09,10,11,12,13,14,15]
[ a, d,--,--,b__________,c______________________]
*/
//难点!!!
struct S4
{
char a;
int b; //a和b总共占8个(因为1 + 4 = 5 小于sizeof(double)=8)要和double对齐.
double c; //占8个字节
char d; //因为要和double对齐,占8个字节
};
cout << sizeof(S4) << endl; //24
/*内存地址排列方式
[00,01,02,03,04,05,06,07,08,09,10,11,12,13,14,15,16,17,18,19,20,21,22,23]
[ a,--,--,--,b__________,c______________________, d,--,--,--,--,--,--,--]
*/
//难点!!!
struct S5
{
char a;
int b; //a和b总共占8个(因为1 + 4 = 5 小于sizeof(double)=8)要和double对齐.
char e; //e 要单独占8个,因为没有空余1个字节位置可以给他
double c; //占8个字节
char d; //因为要和double对齐,占8个字节
};
cout << sizeof(S5) << endl; //32
/*内存地址排列方式
[00,01,02,03,04,05,06,07,08,09,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31]
[ a,--,--,--,b__________, e,--,--,--,--,--,--,--,c______________________, d,--,--,--,--,--,--,--]
*/
return 0;
}
有汇编(内存地址)的知识后,重新回来看c++,感觉理解又深刻了一些.
标签:cout,int,double,S1,cpp,对齐,sizeof,字节 From: https://blog.51cto.com/u_14011026/6190398