1.C++学习笔记:内存模型

C++对象内存模型详解(基于GDB) 因为挺多内容的来自别人博客的学习,所以把相关博客的链接拉上: 虚函数解析:http://blog.csdn.net/haoel/article/details/1948051 C++ 对象的内存布局(上):http://blog.csdn.net/haoel/article/details/3081328 C++对象的内存布局(下):http://blog.csdn.net/haoel/ar... 阅读详情

C++学习笔记

存储持续性、作用域和链接性

C++和C语言对于变量定义的方式类型,定义的不同方式确定了变量的生存周期、作用范围以及可以被谁使用的“权限”问题。

存储持续性

一般来讲我们把存储的持续性简称为变量在程序中定义的位置,有以下三个位置:

1.自动存储持续性:简称自动变量,该变量定义在具体的函数块中,并且不加(static)这种修饰符,该类变量从函数被调用时代码块创建开始到函数执行结束时被释放。

2.静态存储持续性:在函数块外定义的变量(全局变量)和使用关键字static定义的变量的存储特性都是静态的,该类变量在程序的整个生命周期都存在。

3.动态存储持续性:这类内存一般是使用malloc或new申请,通过free或delete进行释放。需要程序员自己进行内存的管理。

如下面这个例子:

//存储数据的三种方案

#include <iostream>

using namespace std;

int global_value = 1;    //静态存储持续性

void func1(void);

void func1(void)
{
    int func1_auto_value = 0;    //自动存储持续性
    static int func1_static_value = 0;    //静态存储持续性
}

int main(int argc, char **argv)
{
    int auto_value = 0;   //自动存储持续性
    int *p_value = NULL;
    func1();

    // p_value为自动存储持续性,而p_value所申请的内存为动态存储持续性
    p_value = (int *)malloc(sizeof(int) * 100);
    if(p_value == NULL){
        cout << "the memory is full!" << endl;
        exit(1);
    }

    free(p_value);    //p_value所申请的内存需要及时释放
    return 0;
}

作用域

关于作用于只要记住以下几点即可:

这里写图片描述

链接性

关于链接性建议大家可以阅读一本较为底层的书《程序员的自我修养》,其中的部分章节详细的介绍了静态链接、动态链接以及符号相关的知识。
如果是linux或unix操作系统建议大家熟练掌握,objdump和redelf这两个可以查看汇编以及底层链接属性的命令,对于寄存器级别的调试非常有用。

说明符和限定符

在C++中我们还需要注意存储说明符和cv限定符。这里和C语言有着少许差异和扩充。

说明符

说明符包含以下几个:

auto (修饰自动类型变量)
register (用于声明中尽量把变量放置在寄存器中)
static (表示内部链接性,修饰的变量不再是全局符号)
extern (引用外部的定义变量或者函数)
thread_local(C++11新增)
mutable

其中需要着重解释下thread_local和mutable

thread_local相当于把修饰的变量当做是线程内部的一部分。

//thread_local test

thread_local int value = 1;

void func1(void);

void func1(void)
{
    m.lock();
    value++;    //value编程了每个线程内部的变量,各个线程的value不会共享
    m.unlock();
}

int main(int argc, char **argv)
{
    std::thread t1(func1);
    std::thread t2(func1);
    t1.join();
    t2.join();
    // value is 1
    return 0;
}

mutable的用来指定即使结构体或者类变量被定义为const,但是被mutable修饰的变量依然可以修改。

// mutable test

struct Test
{
    int a;
    mutable int b;
};

int main(int argc, char **argv)
{
    const Test test1 = {12, 20};
    test1.a = 20;    //false
    test1.b = 30;    // true

    return 0;
}
cv-限定符

const (常性)
volatile (去掉编译器的优化)

const修饰的变量在定义之后不可以被修改(实际上这句话是有缺陷的)。

//const修饰的变量不能被修改的探讨

int main(int argc, char **argv)
{
    const int value = 10;
    value = 30;   //false
    int *p_int = (int *)&value;
    *p_int = 30;   //true
}

也就是说被修饰的value当然不能直接更改,但是如果有int *指针指向了他,使用指针去间接修改value,这种漏洞编译器是很难察觉的,但是作为程序员我们不能去欺负编译器的粗心!!!

volatile的存在是因为在程序中如果发现某个值被多次赋值,则编译器会进行优化,不再每次都从内存取值,而是把该值放在了寄存器中,如果是单线程程序当然这是一个比较好的优化,但是对于多线程程序来说,在多次赋值的期间该变量有可能被其他线程已经修改,这样就会造成错误赋值的过程。为了避免这种过度的优化,我们使用了volatile关键字,这样就会提示编译器每次都去内存中取值。

2024年最新C++并发编程之四 内存模型和原子操作_原子 内存模型(3),2024春招面试 该内存模型是 memory_order_acquire 和 memory_order_release 的组合,即同时包含读取和写入的同步机制。这种内存模型可以保证在写入 atomic 变量之后的所有内存访问都被完成,并且其他线程对 atomic 变量的读取必须在当前线程进行写入之前完成,从而确保线程之间的数据同步。该内存模型是最严格的一种内存模型,可以保证所有的操作都按照程序中指定的顺序执行。在该内存模型下,所有的读取和写入都是按照全局的顺序进行的,因此可以保证所有线程所看到的数据都是一致的。 阅读详情

相关推荐

有带刀后处理

master cam 有带刀后处理,好用!正常使用很长一段时间

linux查看内存

我们通过Linux查看内存free命令查看机器空闲内存时,会发现free的值很小。下面我们就来了解学习下Linux查看内存的命令和对这些命令的解释,这样大家更能够深刻理解我们的Linux查看内存命令 在Linux下查看内存我们一般用free命令: [root@scs-2 tmp]# free total       used       free     shared    buffers 

haiyang_tian20140616的专栏 1935

射频电路设计——射频器件基础

本文仅供自己复习使用,请勿转载! 射频电路制作方法 MCM工艺 CMOS工艺 趋肤效应、深度 频率越高趋肤效应越明显 高频器件 高频电阻 绕线的比贴片的多一个电感,是因为绕线的因为是线绕制的,只有有线就会有电感,所以绕线电阻等效模型会比贴片的多一个电感 多晶硅电阻模型 深线性区MOS电阻 高频电阻的频率响应 记忆的话就后面的频率特性有点像电容的 高频电容 作用 单层贴片式电容 多层贴片式电容 MIM电容 MOM电容 由于是并联的,所以总的电容值是单个的直接相加 PN结电容 M.

输出每日所学,供大家学习使用 7142

c++继承中的内存布局

 今天在网上看到了一篇写得非常好的文章,是有关c++类继承内存布局的。看了之后获益良多,现在转在我自己的博客里面,作为以后复习之用。 ——谈VC++对象模型(美)简.格雷程化    译 译者前言 一个C++程序员,想要进一步提升技术水平的话,应该多了解一些语言的语意细节。对于使用VC++的程序员来说,还应该了解一些VC++对于C++的诠释。 Inside the C++ Object

cesc 1万+

解决Thingsboard数据下发难题:自定义RPC请求格式的3种方法(含源码修改指南)

本文详细介绍了解决Thingsboard数据下发难题的3种自定义RPC请求格式方法,包括规则链脚本转换、TB-Gateway中间层转换和源码级定制方案。通过实际案例和性能对比,帮助开发者根据项目需求选择最适合的解决方案,提升物联网平台与设备的兼容性。

weixin_29008691的博客 232

电机控制::软件架构::微型软件架构

所谓软件架构就是软件分层:HAL库,嵌入式操作系统,中间件,应用层。大型项目可参考借鉴ROS/PX4/Apollo/FMT等无人机、机器人、无人驾驶等开源项目;电机控制大型为AUTOSAR架构,小型跑裸机参考 前后台系统 或 微型实时操作系统对模块管理的思想。基本原理还是参照大型项目的架构来的,只是大部分层与块都相对简单,也没有操作系统这一层。硬件架构了解不同芯片组合及其各自的特点。1.FPGA+;2.架构;3.TC387+AUTOSAR架构,车规级,汽车领域常用。

one__leaf的博客 1695

C++内存模型

在C++中,内存分成5个区,他们分别是: 栈:内存由编译器在需要时自动分配和释放。通常用来存储局部变量和函数参数。(为运行函数而分配的局部变量(包括局部const)、函数参数、返回地址等存放在栈区)。栈运算分配内置于处理器的指令集中,效率很高,但是分配的内存容量有限。在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释放。 堆:内存使用new进行分配,...

菜鸡工坊 3218

Avellaneda & Stoikov’s market-making strategy AS模型的通俗理解篇(一)

δa, δb = bid/ask spread, symmetrical → δa=δb 也就是一段时间内,这个midprice 上蹿下跳的幅度计算,其实做市也就是一种网格,或者说类似布林带,我们经过计算在底部放买单,在高点放一个卖单,如果上下都成交了,那么仓位不变,你把利差赚了。一般来说在震荡行情中,很适合做市,特别是波动率不高情况下,我们通过AS的经典论文得到2个最关键公式,下面来解读一下这个公式的含义,如何在hummingbot 策略中如何设置这些参数。如果单边上涨,你就无货可卖,俗称卖飞了。

weixin_42480337的博客 1万+

cpp学习笔记1

那么拷贝出的局部变量对象中的a指向的空间和被拷贝对象中的a指向的空间是相同的,所以当拷贝出的局部变量对象被使用完进行析构时就会把该指针指向的空间释放,但是被拷贝对象在程序结束后也要进行析构,这就会导致该空间被二次释放,从而引发报错。解决方案:对默认拷贝构造函数进行重写,当拷贝时分配一块新的内存来解决”拷贝出的局部变量对象中的a指向的空间和被拷贝对象中的a指向的空间是相同的“这一问题,这样引用或者指针与否就没有必要了。在继承的过程中,父亲对象中的私有成员也被继承给了儿子,只是编译器将其隐藏。

m0_73959697的博客 1268

某银行大数据分析平台之云原生架构

软考架构师论文

doudoudouy的博客 768

DrMOS电路仿真

将驱动电路与功率MOS集成化后既是DrMOS。把驱动芯片以及上下桥MOSFET封装在一起,这样每一相供电就有了单独的驱动芯片,并且这种高度整合的MOSFET可以通过更高的电流、发热比传统的MOSFET也小很多且更节能 自举升压同步BUCK高低侧栅驱动电路原理及仿真 ...

Srambler的博客 5037

Concurrency-with-Modern-Cpp学习笔记 内存模型的基础知识

c++ 学习笔记 内存模型的基础知识 引用cppreference.com中对内存位置的定义: 标量对象(算术类型、指针类型、枚举类型或std::nullptr_t), 或非零长度的连续序列。 下面是内存位置的例子: struct S { char a; // memory location #1 int b : 5; // memory location #2 int c : 11, // memory location #2 (continued)

虾球 357

反无人机作战体系全解析:从低慢小探测到分层拦截

随着小型无人机在军事和民用领域的广泛使用,低慢小目标探测与拦截成为低空安全的核心挑战。传统防空体系面对成本低廉、飞行高度低、雷达特征小的无人机集群时,暴露出探测难、识别难、处置成本失衡等问题。为应对威胁,反无人机体系采用分层闭环设计,融合雷达、光电、声学与无线电侦测实现多源感知,通过电子战软杀伤与导弹、高炮、激光等硬杀伤手段协同配合,并借助自动化指控系统缩短“传感器到射手”的响应时延。该体系既可支撑战场要地防护,也能为民用低空安防提供参考。围绕分层反制逻辑,梳理探测、软硬杀伤、指控布防及实战短板,提供理解反

weixin_42533120的博客 333

C++Primer Plus学习笔记

此博文是通过翻阅C++ Primer Plus中文第6版(2020),逐章学习记录笔记由此学习C++的基础特性和语法知识,有别于其它视频教学+代码+笔记的学习途径,更趋向传统的书籍+代码+笔记学习,Cpp第6版以C++11标准为主,学习C++基础编程绰绰有余.

weixin_45068267的博客 3198

openclaw通俗入门系列6——记忆系统

记忆 = 智能体的笔记本,分长期(MEMORY.md)和每日(memory/日期.md)。只有写到文件里的才能记住!支持语义搜索(理解意思)+ 关键词搜索,还能自动在压缩前保存重要内容。

m0_60605453的博客 403

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

[C++学习笔记] 第 6 章 内存模型和名称空间

主要介绍了C++中数据的内存模型和新增的 namespace 特性

baymax_123的博客 989

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

C++核心编程:P1->程序的内存模型

本系列文章为黑马程序员C++教程学习笔记 文章目录一、概述二、代码区三、全局区四、栈区五、堆区六、new运算符 一、概述 程序的内存模型 你写的程序、程序中要使用的数据都存放在内存中。而内存会给你划分出4个区域,去存放你所有的内容。 ①代码区 你写的所有的代码都会放到代码区中,如hello word、printf、int a = 1等语句或一些中英文的注释。但是,这些语句都是被转换成对应的机器码再存放在代码区中。 ②全局区 全局区中主要存放的是全局变量、静态变量、常量。 ③栈区 这里边存放的数据的特点是

InnerPeaceHQ的博客 588

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

c++ primer plus学习笔记_第09章 内存模型与名称空间

c++ primer plus>第六版。

编程驴子的博客 922

《深入理解c++对象内存模型》读书笔记

this指针的由来,虚函数的编译,多态的本质

980404514_凡凡的专栏 4812

《C++ primer plus》学习笔记:2~9章

《C++ primer plus》深度知识点复习总结

莱尼的博客 7361

【C++从0到1-黑马程序员】程序的内存模型

C++ 程序执行时,将内存划分为四个区域: 代码区:存放函数体的二进制代码,由操作系统进行管理 全局区:存放全局变量和静态变量以及常量 栈区:由编译器自动分配释放,存放函数的参数值、局部变量等 堆区:程序员分配和释放,若程序员不释放,程序结束时由操作系统回收

Chesnut. 800

Emscripten学习笔记之内存模型

在WebAssembly标准出现前的很长一段时间内,Emscripten的编译目标是asm.js。自1.37.3起,Emscirpten才开始正式支持WebAssembly。以asm.js为编译目标时,C/C代码被编译为.js文件;以WebAssembly为编译目标时,C/C代码被编译为.wasm文件及对应的.js胶水代码文件。两种编译目标从应用角度来说差别不大——它们使用的内存模型、函数导出规则、JavaScript与C相互调用的方法等都是一致的。

u012861978的专栏 1107

C++核心学习笔记1——程序中的内存模型

C++核心编程 本阶段主要针对C++面向对象编程技术做详细讲解,探讨C++中的核心和精髓 内存分区模型 C++程序在执行时,将内存大方向分为四个区域 1.代码区:存放函数体的二进制代码,由操作系统进行管理 2.全局区:存放全局变量,静态变量以及常量 3.栈区:由编译器自动分配释放,存放函数的参数值,局部变量等 4.堆区:由程序员分配和释放,若程序员不释放,程序结束时由操作系统回收 内存四区的意义: 不同区域存放的数据,赋予不同的生命周期,给我们更大的灵活编程 ...

weixin_49522114的博客 290

C++ 学习笔记【基础篇】

C++ 学习笔记【基础篇】

qq_54900679的博客 2054

【C++学习笔记】C++继承与派生

文章目录C++三种继承方式public、protected、private 修饰类的成员public、protected、private 指定继承方式改变访问权限C++继承时的名字遮蔽问题基类成员函数和派生类成员函数不构成重载C++类继承时的作用域嵌套,破解C++继承的一切秘密!C++继承时的对象内存模型继承时的内存模型有成员变量遮蔽时的内存分布C++基类和派生类的构造函数构造函数的调用顺序基类构造函数调用规则C++基类和派生类的析构函数借助指针突破访问权限的限制,访问private、protected属性

qq_41854911的博客 1829

C++内存模型 笔记

链接: https://pan.baidu.com/s/1jKt_luAW99RTipKGwKTlKQ?pwd=iwph 提取码: iwph。通过网盘分享的文件:C++核心_内存模型.docx。C++内存模型笔记分享。

qq_51405399的博客 253
上一篇: apache实现虚拟主机
下一篇: C++学习笔记:C++中的new
linux_player_c
博客等级 码龄13年 214粉丝 134原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值