如何在C++中增加程序堆栈/堆上分配的最大内存?
增加计算机的RAM会自动增加计算机程序的堆栈/堆内存吗?
我有一个从大型数组中读取数据的程序,我最初在Visual Studio中将程序划分为两个独立的项目,每个项目分别工作正常,但是当我尝试将它们组合在一起时,程序在调试时滑动了一些步骤.我对C++很新,所以我开始做一些研究,我发现也许我正在用那些巨大的数组填充堆栈,我应该尝试将它们放在堆上.
我决定更改每个数组std::vector
并以这种方式初始化它们:
std::vector<double> meanTimeAO = { 0.4437, 0.441, 0.44206, 0.44632, 0.4508, 0.45425,...}
Run Code Online (Sandbox Code Playgroud)
但是当我尝试编译编译器崩溃堆栈溢出后现在更改所有数组后,我以为我通过将数组更改为向量来释放堆栈中的内存空间但是看起来我有相反的结果,为什么呢??
我该如何处理这些大数组呢?(它们是固定不变的值或大小)
在C++中将向量声明为全局是一种好习惯吗?
这就是我做的.
#include <vector>
std::vector<int> vec;
Run Code Online (Sandbox Code Playgroud)
我的程序编译成功,但我不确定这是否会在某些情况下导致运行时错误.根据我的理解,全局变量的内存将在编译时分配,编译器可以保留此向量可以扩展的有限数量的内存.达到此限制后,正在写入的内容可能会吞噬另一个变量使用的内存.
请指教.
在尝试编写优化的DSP算法时,我想知道堆栈分配和堆分配之间的相对速度,以及堆栈分配的数组的大小限制.我意识到堆栈帧大小限制,但我不明白为什么以下运行,生成看似真实的基准测试结果cargo bench
,但运行时出现堆栈溢出失败cargo test --release
.
#![feature(test)]
extern crate test;
#[cfg(test)]
mod tests {
use test::Bencher;
#[bench]
fn it_works(b: &mut Bencher) {
b.iter(|| { let stack = [[[0.0; 2]; 512]; 512]; });
}
}
Run Code Online (Sandbox Code Playgroud) 假设需要一个固定大小的缓冲区,是否有大小限制或阈值,这样在大小限制下可以使用快速堆栈分配std::array
,并且超过该限制最好使用std::vector
从堆动态分配的内存(因为堆栈内存很珍贵,不应该消耗太多)?
// I think allocating 32 bytes on the stack is just fine.
std::array<BYTE, 32> smallBuffer;
// For 32KB, it's better getting memory from the heap.
std::vector<BYTE> bigBuffer(32*1024);
// Is it better to allocate a 1KB buffer on the stack (with std::array)
// or is it too much, and it's better to allocate on the heap (using std::vector)?
// What about 512 bytes? And 4KB?
// Is there a suggested size threshold?
std::array<BYTE, 1024> …
Run Code Online (Sandbox Code Playgroud) 请考虑以下代码(仅用于演示目的):
#include <iostream>
int main()
{
char pixels[4][1280][720]; // Big enough to cause a stack overflow on my machine
for (unsigned int i = 0; i < 4; i++)
{
for (unsigned int j = 0; j < 1280; j++)
{
for (unsigned int k = 0; k < 720; k++)
{
pixels[i][j][k] = i + j + k;
}
}
}
std::cout << pixels[2][640][360];
return 0;
}
Run Code Online (Sandbox Code Playgroud)
根据这个问题的答案,最大堆栈大小由visual studio设置.
假设它可以警告用户潜在的堆栈溢出,我是否正确?(我自己尝试了这个并没有得到警告)
PS:我问的唯一原因是因为我看到很多关于SO的问题可以通过这样的警告来防止(是的,我知道不是每个SO用户都使用VS).
应该避免在C/C++中使用函数的递归调用吗?
我从事机器学习/数据挖掘,因此让我的代码可扩展是非常关键的.
当我使用Java时,我尽可能避免使用递归调用,因为我经常让我的调用堆栈溢出.虽然有控制分配给调用堆栈的内存量的选项,但我认为让我的程序依赖于较少数量的参数是更理想的.因此,当很清楚如何在没有递归调用的情况下实现,可能使用自己管理的堆栈,我这样做了.但即使在Java中,我也不确定这是一门正确的学科.
据我所知,C/C++中没有调用堆栈,所以我不担心溢出它.因此,我很好奇:在程序的可伸缩性方面,是否会尝试避免使用递归,或者是鼓励它,还是特定于问题?
如何增加 Code::Blocks 中的堆栈大小?
我读过这篇文章,它说 VS 中的默认堆栈大小是 1MB。现在就我而言,它与 VS 无关,堆栈大小取决于操作系统。在我的 win10 情况下,它是 1MB。
这 似乎有点过时,如下所示:project->build options->linker settings->other linker options
不再存在。
项目栏下没有构建。
无论如何,我需要增加我的堆栈大小,以便我可以声明一个巨大的二维字符数组并从缓存中受益。喜欢arr[1000][1000]
。因为它将在连续内存上,而不是char* arr[100]
指向包含 1000 个字节的 1000 个不同的内存地址。
我正在使用 Windows 10 mingw 编译器。
我知道这必须是一个n00b问题,但我必须实现一个模型客户端 - 服务器顺序交互应用程序,并且因为客户端 - 服务器调用的数量不同,我不能只是迭代外部函数中的步骤,总是从中获取数据客户端,然后将其转发到服务器,反之亦然,所以我需要让我Server
和我们Client
相互了解,以便他们可以在自己之间调用他们的公共方法.一种方法是将两者都设计为单身,但我希望以更简单的方式进行,更准确地说使用循环引用:客户端存储对服务器的引用,服务器存储对客户端的引用.我知道这可能不是一个好方法,并且当它变得太深时它可能导致调用堆栈爆炸,因此欢迎对我的设计进行任何改进.
为了实现所描述的实现,我认为我可以使用std::shared_ptr
,因为std::unique_ptr
当我调用两个setter时,如果我还想阻止main中的两个变量被破坏,那么它将无法工作(对吗?).所以,这就是我所拥有的(简化代码):
#include <iostream>
#include <memory>
class Server;
class Client
{
public:
void SetServer (const Server &server);
private:
std::shared_ptr<const Server> server;
};
void Client::SetServer (const Server &server)
{
this->server = std::shared_ptr<const Server>(&server);
}
class Server
{
public:
void SetClient (const Client &client);
private:
std::shared_ptr<const Client> client;
};
void Server::SetClient (const Client &client)
{
this->client = std::shared_ptr<const Client>(&client);
}
int main ()
{
Server server;
Client client; …
Run Code Online (Sandbox Code Playgroud) c++ pointers client-server pass-by-reference circular-reference
我想要有关VC++(32位和64位)中堆栈溢出的准确信息,特别是在递归中.在调试模式下,这种情况很快发生在递归中(如4500运行简单的递归函数不做任何事情或类似).但是,似乎发布模式不同.这很难理解,我现在没有测试它,因为优化会删除不做任何事情的代码(显然会删除递归),因为我的代码或函数是这样的......我应该做更多...我测量在优化版本中的正确时间,我不知道优化是否会通过递归实现更复杂的快速排序?
谢谢!
c++ ×8
stack ×4
c ×3
arrays ×2
c++11 ×2
heap ×2
memory ×2
recursion ×2
vector ×2
benchmarking ×1
callstack ×1
codeblocks ×1
pointers ×1
rust ×1
rust-cargo ×1
testing ×1
visual-c++ ×1
windows ×1