在c++中声明vector为全局变量

Declaring vector as global variable in C++

本文关键字:全局变量 vector 声明 c++      更新时间:2023-10-16

在c++中声明vector为全局是否是一个好的实践?

这就是我所做的。

#include <vector>
std::vector<int> vec;

我的程序编译成功,但我不确定这是否会导致运行时在某些情况下的错误。根据我的理解,全局变量的内存将在编译时分配,编译器可能会保留有限的内存,这个向量可以扩展到这个内存。一旦达到这个限制,正在写入的内容可能会占用另一个变量使用的内存。

请建议。

我的程序编译成功,但我不确定这是否可以在某些情况下导致运行时错误。

这样做是安全的;vec变量的存储空间将被静态分配,并且它的默认构造函数将在某个时刻被调用(确切地说,在整个程序的上下文中没有严格定义,因为跨翻译单元的初始化顺序没有严格定义)。

和编译器可能会保留有限的内存向量可以展开。一旦达到这个限制,正在写的东西就会占用另一个变量使用的内存

vector本身在堆上分配存储空间,因此不会对其扩展施加任何限制,如果将vector实例化为局部变量则会有所不同:您基本上会受到在vector需要重新分配其内部存储的时间点上可以连续分配的内存量的限制。

说了这么多,虽然这样做是安全的,但不一定是好的做法;它属于所有其他全局变量或全局可访问存储位的领域,这可能是一个有争议的主题。一般来说,我建议最好避免使用全局变量。虽然在某些情况下是可以接受的,但全局访问与控制对变量的访问并对其实施不变量及其控制或暗示的状态的能力背道而驰。随着代码库的扩展,这可能导致难以维护的系统,因为这些访问路径没有清楚地说明。

根据我的理解,全局变量的内存将在编译时分配,编译器可能会保留有限的内存量,以便向量可以扩展。

这是错误的理解。

内存在编译时没有分配。内存在程序启动时分配,然后在程序运行期间分配,具体取决于变量的存储类型。当程序关闭时,它所使用的所有内存将返回给操作系统,无论如何。

一旦达到这个限制,正在写入的内容可能会占用另一个变量使用的内存。

std::vector<int>的对象永远不能占用其他变量使用的内存

现在回到你的主要问题,

在c++中声明一个向量是一个很好的实践吗?

。避免使用全局变量,不管它们的类型是什么。

在全局变量区域中只分配vector元数据的空间。vector的内容仍然是动态分配的(全局变量的构造函数和析构函数正常运行)。

对于自动向量变量也是同样的情况,比如:

int main(void)
{
    std::vector<int> v;
    return 0;
}

自动变量可用的堆栈空间是有限的,但是向量内容不会使用这个空间,只有少数指针和计数器。

全局变量通常是不好的做法。它们不会像你说的那样"吃掉"另一个变量的内存,然而,作为程序员,你很容易把事情搞砸。例如,程序中的所有东西都可以访问这个向量,所以所有东西都可以访问和修改它。你可能想要,也可能不想要,但更有可能的是,你不想要。

至于内存分配,添加到vector中的对象仍然在运行时添加(因为它们在编译时不存在!)在编译时也不会分配内存。您的程序具有在运行时分配此内存的签名。想想看……如果程序在编译时分配内存,您就不能在其他机器上运行它们了,不是吗?内存将分配给您的机器,而不是其他机器。因此,必须在运行时分配内存。

你的程序在编译时没有分配任何东西——我想你是指运行时。

Vector在堆上分配它所保存的内容(Vector .size() * sizeof(/*你所持有的内容*/))-它在分配的位置保存sizeof(std:: Vector <>)。全局变量可以存储在任何地方,这取决于实现。

嗯,vec是一个全局变量,所以它的内存大概是从数据段分配的。然而,vec内容的内存取决于分配器。默认情况下,我认为内容的内存是从堆中分配的。