完全解析vector源码(新手向)

文章内所有内容均为博主自己整合,带有自己的一些理解,如果有误或者其他扩展,希望各位网友能及时指出,十分感谢!

希望能通过这篇文章,能深入理解C++的一些特性和知识

目录

首先看第六行代码#pragma once

第7~15行代码#ifndef _VECTOR_


首先看第六行代码#pragma once

#pragma once

是一种预处理器指令,确保头文件只能被编译一次,防止被重复编译

工作原理:当预处理器遇到 #pragma once,它会检查当前文件是否被编译过。(因为如果一个文件被重复包含,可能会有错误?)如果没有,它会忽略文件的[全部内容]!

第7~15行代码#ifndef _VECTOR_

// vectorlib.h

#ifndef VECTORLIB_VECTOR_H
#define VECTORLIB_VECTOR_H

// Vector 类的定义

#endif // VECTORLIB_VECTOR_H

#ifndef是C++的预处理器指令,用于条件编译。它的意思是"如果当前没有定义宏,

那就定义这个宏,并且定义了vector类的定义"

再来看7~15行代码

#ifndef _VECTOR_
#define _VECTOR_
#include <yvals_core.h>
#if _STL_COMPILER_PREPROCESSOR
#include <xmemory>

#if _HAS_CXX17
#include <xpolymorphic_allocator.h>
#endif // _HAS_CXX17

#include <yvals_core.h>        是一个假设的头文件名,并不一定是标准C++库的一部分

#if _STL_COMPILER_PREPROCESSOR        检查是否定义这个宏

//这个宏同来用于标识编译器是否在预处理标准库代码

如果定义了(这个宏通常在yvas_core.h里面定义的),就包含头文件<xmemory>

<memory>        通常包含了内存分配器的相关定义和实现

接下来同理

如果定义了宏_HAS_CXX17               这个标识编译器是否支持C++17标准

如果已经定于,就包含C++17标准中引入的多态分配器的实现

19~29行代码

#pragma pack(push, _CRT_PACKING)
#pragma warning(push, _STL_WARNING_LEVEL)
#pragma warning(disable : _STL_DISABLED_WARNINGS)
_STL_DISABLE_CLANG_WARNINGS
#pragma push_macro("new")
#undef new

先来看第一行代码#pragma pack(push,_CRT_PACKING)
它是C和C++编译中

用于控制数据对齐的预处理指令。

数据对齐是指编译器如何将数据成员放置在内存中的过程。

对齐通常是为了提高访问速度,因为许多处理器对某些地址对齐的数据访问更快

1.       #pragma pack        用于控制后续数据成员的对齐方式

2.        push                        将当前的#pragma pack设置保存在栈中

3.        _CRT_PACKING        表示编译器默认的数据对齐方式

举个栗子:

#pragma pack(push, 1) // 设置数据对齐为 1 字节边界

struct MyStruct {
    char a; // 通常占用 1 字节
    int b;  // 可能占用 4 字节,取决于平台
};

#pragma pack(pop) // 恢复到默认对齐方式

这个例子中,Mystruct的成员b不会自动对齐到4字节边界,而是紧随a之后,可能只占用3个字节的空间,既可以节省内存空间,但可能会降低访问速度。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值