C++对象模型(4)-- 数据语义学:数据成员的内存布局

1、数据成员的声明顺序和内存布局

变量的布局顺序与它的声明顺序是一致的。

我们先来看一段代码:

复制代码
class Base {
public:
    // 变量地址
    void print() {
        cout << " this:" << this << endl;
        cout << " &i1:" << &i1 << endl;
        cout << " &i2:" << &i2 << endl;
        cout << " &i3:" << &i3 << endl;
    }
    // 变量偏移量
    void print_offset() {
        printf(" Base::i1 = %d\n", &Base::i1);
        printf(" Base::i2 = %d\n", &Base::i2);
        printf(" Base::i3 = %d\n", &Base::i3);
    }

private:
    int i1;
    int i2;
    int i3;
};

int main()
{
    Base base;
    base.print();
    printf("\n");
    base.print_offset();
}

我们看到输出的地址是这样的:

从这些地址我们可以看到,变量的布局顺序与它的声明顺序是一致的。

下面我们把变量的声明修改一下,分别看一下修改后的输出地址。

(1)

复制代码
int i1;
static int is;
int i2;
int i3;

(2)

复制代码
int i1;
void print2();
int i2;
int i3;

(3)

复制代码
public:
    int i1;
private:
    int i2;
    int i3;

从测试结果看,变量i1, i2, i3的输出顺序并没有发生变化,我们可以得出这样的结论:

(1)变量的访问属性public, protected, private对变量的布局顺序没有影响;

(2)变量中间添加static变量和成员函数对变量的布局顺序也没有影响。

2、字节对齐对数据成员内存布局的影响

(1)比如我们声明如下的变量:

这里我说明下,int占4个字节,short占2个字节。

复制代码
int i1;
short s1;
int i2;
short s2;

输出地址是这样的:

内存布局是这样的:

(2)现在我们把变量的声明顺序修改一下:

复制代码
int i1;
int i2;
short s1;
short s2;

输出地址是这样的:

内存布局是这样的:

相关推荐
智者知已应修善业3 分钟前
【51单片机初始化D5-D8亮,每按键按下D1到D4全亮,再按下恢复,如此循环】2024-3-26
c++·经验分享·笔记·算法·51单片机
为何创造硅基生物16 分钟前
C++ 独占指针被销毁后,堆也会自己销毁
c++
C+-C资深大佬28 分钟前
C++ 中的 constexpr与 const区
java·开发语言·c++
Tairitsu_H35 分钟前
[LC优选算法#3] 滑动窗口 | 将x减到0的最⼩操作数 | ⽔果成篮 | 字⺟异位词
c++·算法·leetcode·滑动窗口
c++之路40 分钟前
CMake 系列教程(一):CMake 基础知识
c语言·开发语言·c++
Irissgwe44 分钟前
C++ STL bitset 和位图详解
开发语言·c++·stl·位图·bitset
万法若空1 小时前
C/C++基本类型表示范围
c语言·开发语言·c++
凡人叶枫2 小时前
Effective C++ 条款15:在资源管理类中提供对原始资源的访问
linux·开发语言·c++·stm32·单片机
郝学胜-神的一滴2 小时前
中级OpenGL教程 009:用环境光告别模型死黑
前端·c++·unity·godot·图形渲染·opengl·unreal
cccyi72 小时前
C++ 面试题整理
c++·面试