在C++中将向量声明为全局是一种好习惯吗?
这就是我做的.
#include <vector>
std::vector<int> vec;
Run Code Online (Sandbox Code Playgroud)
我的程序编译成功,但我不确定这是否会在某些情况下导致运行时错误.根据我的理解,全局变量的内存将在编译时分配,编译器可以保留此向量可以扩展的有限数量的内存.达到此限制后,正在写入的内容可能会吞噬另一个变量使用的内存.
请指教.
我的程序编译成功,但我不确定这是否会在某些情况下导致运行时错误.
这样做是安全的; vec变量的存储将被静态分配,并且它的默认构造函数将在某个时刻被调用(确切地说,在整个程序的上下文中没有严格定义,因为没有严格定义跨翻译单元的初始化顺序).
并且编译器可以保留该向量可以扩展的有限数量的存储器.达到此限制后,正在写入的内容可能会吞噬另一个变量使用的内存.
向量本身在堆上分配它的存储,因此如果你将向量实例化为局部变量,对它的扩展没有任何限制会有所不同:你基本上会被你可以连续的内存量所限制在向量需要重新分配其内部存储的时间点分配.
所有这些都说,虽然这样做是安全的,但这不一定是好的做法; 它属于每个其他全局变量或全局可访问的存储区域,这可能是一个有争议的主题.一般来说,我建议最好避免全局变量作为规则.虽然在某些情况下可能是可以接受的,但全局访问与您控制对变量的访问并强制执行变量及其控制或暗示的状态的能力背道而驰.这会导致难以维护的系统,因为代码库会扩展,因为这些访问路径没有明确说明.
根据我的理解,全局变量的内存会在编译时分配,编译器可能会保留有限的内存量,这个向量可以扩展到。
这是错误的理解。
编译时不分配内存。内存在程序启动时分配,然后在程序期间分配,具体取决于变量的存储类型。当程序关闭时,它使用的所有内存都归还给操作系统,无论如何。
达到此限制后,正在写入的内容可能会占用另一个变量使用的内存。
不。一个对象std::vector<int>永远不能占用另一个变量使用的内存。
现在回到你的主要问题,
在 C++ 中将向量声明为全局是一个好习惯吗?
不。避免使用全局变量,无论它们的类型如何。
全局变量区域中只会分配向量元数据的空间。向量内容仍将动态分配(构造函数和析构函数对于全局变量正常运行)。
自动向量变量的情况相同,例如:
int main(void)
{
std::vector<int> v;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
可用于自动变量的堆栈空间是有限的,但向量内容不会使用这个空间,只有少数指针和计数器。