const char *s1 = "asd";
vsconst 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
选项才会生成
可用readelf
、size
、objdump
等工具查看目标文件。
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
参考: