IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> C.x#【静态编译】—1.1 编译期初始化与运行期初始化 -> 正文阅读

[C++知识库]C.x#【静态编译】—1.1 编译期初始化与运行期初始化

1 编译期初始化

在源代码被编译过程中,编译期会加入代码逻辑,以完成确定的内存分配 和 变量的初始化。分配内存,并非实际分配内存,而是写入其内存分配大小信息

如:全局变量为内置类型,并且大小确定

int a=2;?
static int b=3; ? //static的不同只是其只在本文件中可见
static int c=a+b;

在编译期初始化,那么在实际运行期都是确定的结构和逻辑,将带来更高的性能,因为编译器完成了一定的工作。

1.1 全局变量

全局变量在main函数第一次使用它之前,就把它初始化好。但这个初始化可细分为:
编译时初始化?加载时初始化,即static initialization?和?dynamic initialization

(静态变量见 5 补充)

1.1.1 编译时初始化静态初始化

是针对于那些简单的、c++内部定义的数据结构(也称 内置结构),如int,double,bool? 及? 数组结构? 的初始化,又可分为两种方式:

  • .bss段 ? ?未初始化的变量,也就是我们没指定初值,编译器分配0值给它,编译时编译器将其分配在.bss段,不占用rom空间
  • .data 段? 已初始化的变量,也就是我们指定了初值,编译器将其分配在.data段,占用rom空间。

2 加载时初始化

全局类对象在main函数执行前,由加载程序完成其初始化,其无法在编译期初始化,由于那时候还无法调用类的构造函数。

同时,在加载期,是线程安全的。例如,饿汉方式的单例类:

借助main执行前的加载期完成初始化,由于还在加载所以确保线程安全。

class A
{
private:
    A(){}
 
    static A* instance;
public:
    static A* getInstance()
    {
        return instance;
    }
 
 
};
A* A::instance=new A();  //main 执行前的加载期,完成的初始化
 
int main()
{
 
   
}

3 运行期初始化

指代实际程序运行期间对象(变量)的创建,包含那些动态创建的对象。由于编译和加载时无法确定大小,因此它们只能延迟到运行期才能完成初始化,将带来程序的性能开销。并且由于运行期间可能是多线程环境,对于共享变量,还可能带来线程安全问题。?

int main()
{
   int* p=new int[N];
   A* arr=new A(0);
 
}

另外针对静态变量,若其是普通的具有本文可见性的普通静态变量

其可能在编译期(内置类型)初始化或者在加载期(类的静态成员)初始化。

但针对函数内部的局部static变量,其在第一次被调用时初始化,并且只初始化一次

类的静态成员

c++规定,const的静态成员可以直接在类内进行初始化,而非const的静态成员需要在类外声明以初始化,对于后一种情况,我们一般选择在类的实现文件中初始化。至此,具体的初始化方式和上面说的是一致的,可在编译期间初始化,也可在运行期间初始化。

在类中定义const变量有以下两个好处:

1.静态数据成员没有进入程序的全局名字空间,因此不存在与程序中的其他全局名字冲突的可能性。

2.可以实现信息的隐藏。

#include<iostream>

using namespace std;

class sb{

private:

const int i=5;

public:


void print();

};

4 总结

另外,静态初始化先于动态初始化。因为静态初始化发生在编译时期,直接写进.bss段和.data段,在程序执行时直接加载;而动态初始化则是在运行时期,由运行时库调用相应构造函数进行初始化,同样要写进.bss段或.data段。

5 补充

.data段和.bss段的区别:

.data段存放的是已初始化好的全局变量和静态变量
.bss段存放的是未初始化的全局变量和静态变量,给其赋0值【在有些编译器中,初始化为0的静态变量和全局变量也放在.bss段】
?

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2022-07-05 23:22:06  更:2022-07-05 23:23:58 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/12 11:55:19-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码