在内存中定义数据类型,不管是类成员还是结构体数据成员,在内存中会进行内存对齐。本实例是WIN7_X86架构下进行的代码测试。
**本例测试两个目标:
1、实现内存对齐。
2、通过指针操作查找数据成员。**
头文件中声明类成员和结构体类型,代码如下:
//padding.hpp
#ifndef PADDING_HPP_
#define PADDING_HPP_
//下面的结构体类型定义为C语言格式的结构体定义
typedef struct
{
char c;
int x;
double dz;
}STRUCTDATA;
//下面的结构体类型为C++格式
struct Str_CPlusPlus
{
char c;
int n;
double dcp;
};
class padding
{
private:
char a;
int n;
double dou;
public:
padding(char c='a', int i = 100, double d = 2.3) : a(c), n(i), dou(d) {}
};
#endif // PADDING_HPP_
源文件中main.cpp中实现内存显示,如下所示:
#include <iostream>
#include "padding.hpp"
#define EXIT_SUCCESS 0 //此条宏定义最好放在头文件中
using namespace std;
int main()
{
padding pad; // Class
cout << "sizeof(padding) == " << sizeof(padding) << endl;
cout << "(sizeof(char) + sizeof(int) + sizeof(double)) == " <<
(sizeof(char) + sizeof(int) + sizeof(double)) << endl;
char* p = (char*)(&pad); //类成员转换指针必须要强制转换
int int_len = sizeof(int);
cout << "padding 1st element:" << *p << endl;
cout << "padding 2nd element:" << *(int*)(p + int_len) << endl;
cout << "padding 3rd element:" << *(double*)(p + (int_len << 1)) << endl;
STRUCTDATA st_Data; // C 格式结构体
cout << "sizeof(st_Data) == " << sizeof(st_Data) << endl;
st_Data.c = 'x';
st_Data.dz = 3.14;
st_Data.x = 64;
char* q = (char*)(&st_Data); //类成员转换指针必须要强制转换
cout << "st_Data 1st element:" << *q << endl;
cout << "st_Data 2nd element:" << *(int*)(q + int_len) << endl;
cout << "st_Data 3rd element:" << *(double*)(q + (int_len << 1)) << endl;
Str_CPlusPlus st_cplusplus;
cout << "sizeof(st_cplusplus) == " << sizeof(st_cplusplus) << endl;
st_cplusplus.c = 'c';
st_cplusplus.dcp = 1.72;
st_cplusplus.n = 32;
char* r = (char*)(&st_cplusplus); //类成员转换指针必须要强制转换
cout << "st_cplusplus 1st element:" << *r << endl;
cout << "st_cplusplus 2nd element:" << *(int*)(r + int_len) << endl;
cout << "st_cplusplus 3rd element:" << *(double*)(r + (int_len << 1)) << endl;
return EXIT_SUCCESS;
}
通过编译,即可查看结构体或类成员对齐。