文章内所有内容均为博主自己整合,带有自己的一些理解,如果有误或者其他扩展,希望各位网友能及时指出,十分感谢!
希望能通过这篇文章,能深入理解C++的一些特性和知识
目录
首先看第六行代码#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个字节的空间,既可以节省内存空间,但可能会降低访问速度。