C++内存分布

const char *s1 = "asd"; vs const char s2[] = "asd";:
https://www.quora.com/Are-char*-and-char-variables-stored-in-distinct-areas-in-the-memory-I-printed-the-addresses-of-two-variables-p-and-q-respectively-char*-and-char-allocated-successively-and-the-addresses-seem-to-disparate-What-may-be-the-reason-for-this

以下内容纯粹是个人理解,不保证完全正确性。

可重定位目标文件

  • .text: 已编译程序的机器代码
  • .rodata:只读数据
  • .data:已初始化的全局和静态C变量
  • .bss:已初始化的全局和静态C变量,和被初始化为0的全局或静态变量,不占用实际的磁盘空间(注意:在执行性目标文件中是占用空间的,具体不明),运行时在内存中分配变量
  • .symtab:符号表
  • .debug:符号调试表,需要在编译时指定-g选项才会生成

可用readelfsizeobjdump等工具查看目标文件

const int x = 10; //.rodata:4B;
int y = 10; //.data: 4B

static int sx = 10; //.data:4B

/*
为了对齐?
int a; //.bss: 2B?
int b, c; //.bss: 2B?
int d,e,f; //.bss: 8B?
int g,h,i,j; //.bss: 8B? 
*/

int main(){
	const char s1* = "1234"; //.rodata: 4B, "1234"; 运行时stack: 5B, "1234\0"
	const char s2[] = "1234"; //运行时stack: 5B, "1234\0"
	const int x = 10; //运行时:stack: 4B
	static int sx = 10; //.data:4B
}

static/extern/const

extern表示声明变量,不过定义在别处,用户多文件共享变量,常声明与头文件
static用于将变量限定于单个文件中,如果定义在头文件中,那么每一个包含该头文件的源文件都会有自己的副本,因此常定义在源文件中
const单独使用时类似const,同样作用域是文件,可见域取决于定义的位置

EXAMPLE

//head.h
#ifndef HEAD
#define HEAD
#include <bits/stdc++.h>
using std::cin, std::cout, std::endl;
extern int x;
static int y = 2;
const int z = 3;
void func();
#endif
//src1.cpp
#include "head.h"
void func(){
    cout<<"insize src1.cpp:\n";
    cout<<"&x="<<&x<<"\t&y="<<&y<<"\t&z="<<&z<<endl;
    cout<<"x="<<x<<"\ty="<<y<<"\tz="<<z<<endl;
    x = 3;
    y = 4;
    cout<<"chaneded: x=3, y=4 in src1.cpp\n";
}
//src2.cpp
#include "head.h"
int x = 1;

int main(){
    cout<<"init: extern int x, static int y=2, const int z=3 in head.h\n";
    cout<<"init: int x=1 in src2.cpp\n";
    
    cout<<"insize src2.cpp:\n";
    cout<<"&x="<<&x<<"\t&y="<<&y<<"\t&z="<<&z<<endl;
    cout<<"x="<<x<<"\ty="<<y<<"\tz="<<z<<endl;
    func();
    cout<<"insize src2.cpp:\n";
    cout<<"x="<<x<<"\ty="<<y<<"\tz="<<z<<endl;
}

output:

init: extern int x, static int y=2, const int z=3 in head.h
init: int x=1 in src2.cpp
insize src2.cpp:
&x=0x5577cbdca014	&y=0x5577cbdca010	&z=0x5577cbbc8f20
x=1	y=2	z=3
insize src1.cpp:
&x=0x5577cbdca014	&y=0x5577cbdca018	&z=0x5577cbbc9078
x=1	y=2	z=3
chaneded: x=3, y=4 in src1.cpp
insize src2.cpp:
x=3	y=2	z=3


参考:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值