我有一个程序,它执行递归调用20亿次,堆栈溢出.我做了更改,然后它仍然需要40K递归调用.所以我需要几个MB堆栈内存.我听说堆栈大小默认为1MB.我尝试在线搜索.有人说在视觉工作室里去了属性 - >链接器.........但我找不到它.
有谁知道如何增加它?另外我想知道我是否可以在我的C#程序中设置它?
PS我使用的是32位winXP和64位win7.
在C99这是合法的:
void f(size_t sz) {
char arr[sz];
// ...
}
Run Code Online (Sandbox Code Playgroud)
但是,这个 - 动态大小的堆栈数组 - 已经在C++中被删除了,而没有在C++ 11中看到返回.
AFAIK C++是在考虑到C兼容性的情况下制作的,所以我想知道必须有一些非常好的论据,不包括这个有用的功能,对吗?
我能想到的就是:
delete [])和慢堆分配.为了防止这种情况被关闭为"主观"或"不具有建设性",我正在寻找来自委员会成员的引用或者讨论谈论此事的讨论的链接 - 当然还有快速的SO综述的奖励积分.
而不是将其视为小马与仓鼠的讨论,将其视为一个历史问题,仅仅关注所考虑的优势和劣势(如果有的话).
编辑:正如James McNellis在下面的评论中所指出的,C++标准化可变长度数组之前存在C++.你可能会把我的问题读作:" 为什么没有,他们不会添加它? ".
可能重复:
字符串对象和字符串文字之间的差异
假设我有两个陈述.
String one = "abc";
String two = new String("abc");
Run Code Online (Sandbox Code Playgroud)
哪一个是堆栈内存并存储在堆中?
这两者有什么区别?
创建了多少个对象以及内存中的引用如何?
什么是最佳做法?
是的,我确信这已被多次隐含地回答,但我似乎无法完全理解它.
如果你有一个(x86)堆栈跟踪(比如,在WinDbg中查看它),并且你看一下寄存器,那么EBP和ESP值相隔x个字节意味着什么?
链接:
举一个最近的堆栈跟踪示例,我有:
0:016> k
ChildEBP RetAddr
1ac5ee8c 76b831bb ntdll!NtDelayExecution+0x15
1ac5eef4 76b83a8b KERNELBASE!SleepEx+0x65
1ac5ef04 0060e848 KERNELBASE!Sleep+0xf
1ac5ef10 76859d77 MyApp!application_crash::CommonUnhandledExceptionFilter+0x48 [...\applicationcrash.inc.cpp @ 47]
1ac5ef98 775a0df7 kernel32!UnhandledExceptionFilter+0x127
1ac5efa0 775a0cd4 ntdll!__RtlUserThreadStart+0x62
1ac5efb4 775a0b71 ntdll!_EH4_CallFilterFunc+0x12
1ac5efdc 77576ac9 ntdll!_except_handler4+0x8e
1ac5f000 77576a9b ntdll!ExecuteHandler2+0x26
1ac5f0b0 7754010f ntdll!ExecuteHandler+0x24
1ac5f0b0 6e8858bb ntdll!KiUserExceptionDispatcher+0xf
1ac5f400 74e68ed7 mfc80u!ATL::CSimpleStringT<wchar_t,1>::GetString [f:\dd\vctools\vc7libs\ship\atlmfc\include\atlsimpstr.h @ 548]
1ac5fec0 6e8c818e msvcr80!_NLG_Return [F:\dd\vctools\crt_bld\SELF_X86\crt\prebuild\eh\i386\lowhelpr.asm @ 73]
1ac5ff48 74e429bb mfc80u!_AfxThreadEntry+0xf2 [f:\dd\vctools\vc7libs\ship\atlmfc\src\mfc\thrdcore.cpp @ 109]
1ac5ff80 74e42a47 msvcr80!_callthreadstartex+0x1b [f:\dd\vctools\crt_bld\self_x86\crt\src\threadex.c @ 348]
1ac5ff88 76833677 msvcr80!_threadstartex+0x66 [f:\dd\vctools\crt_bld\self_x86\crt\src\threadex.c @ 326]
1ac5ff94 77569f02 kernel32!BaseThreadInitThunk+0xe …Run Code Online (Sandbox Code Playgroud) 是std::array<int,10>(没有我自己使用new)保证在堆栈中分配,而不是由C++ - Standard分配?
要清楚,我不是故意的new std::array<int, 10>.我主要想知道,如果允许标准库new在其实现中使用.
在多线程嵌入式软件(用C或C++编写)中,必须为线程提供足够的堆栈空间,以使其能够完成其操作而不会溢出.在某些实时嵌入式环境中,正确调整堆栈大小至关重要,因为(至少在我使用过的某些系统中),操作系统不会为您检测到这一点.
通常,在创建线程时(即在pthread_create()等的参数中)指定新线程(除主线程之外)的堆栈大小.通常,这些堆栈大小被硬编码为在最初编写或测试代码时已知良好的值.
但是,对代码的未来更改通常会破坏硬编码堆栈大小所基于的假设,并且在一个重要的日子里,您的线程进入其调用图的更深层分支之一并溢出堆栈 - 从而导致整个系统崩溃或者默默地腐蚀记忆.
在线程中执行的代码在堆栈上声明struct实例的情况下,我个人已经看到了这个问题.当结构体被扩充以容纳额外数据时,堆栈大小相应地膨胀,可能允许堆栈溢出发生.我想这对于已建立的代码库来说可能是一个巨大的问题,其中无法立即知道向结构添加字段的全部效果(太多的线程/函数来查找使用该结构的所有位置).
由于对"堆栈大小"问题的通常响应是"它们不可移植",因此我们假设编译器,操作系统和处理器都是此调查的已知数量.我们也假设没有使用递归,所以我们没有处理"无限递归"场景的可能性.
有哪些可靠的方法来估计线程所需的堆栈大小?我更喜欢离线(静态分析)和自动方法,但欢迎所有想法.
我正在尝试构建一个网页,我需要在JavaScript中挖掘几个100MB的数据.对于不同的浏览器,我在不同的数据量下遇到"超出最大调用堆栈大小"错误.
我可以通过遍历我的代码并尝试将函数内部的局部变量移动到更全局的范围来尝试将它们分配到堆而不是堆栈来解决此问题吗?或者JavaScript中不存在这些概念?(据我所知,我的数据中没有任何主要的递归循环,所以它确实是一些巨大的字符串/数字数组似乎导致错误)
如果这不可能,有没有办法要求浏览器保留更多内存?
例如,如果括号/括号在以下内容中匹配:
({})
(()){}()
()
Run Code Online (Sandbox Code Playgroud)
依此类推,但如果括号/括号不匹配,则应返回false,例如:
{}
({}(
){})
(()
Run Code Online (Sandbox Code Playgroud)
等等.你能查一下这段代码吗?提前致谢.
public static boolean isParenthesisMatch(String str) {
Stack<Character> stack = new Stack<Character>();
char c;
for(int i=0; i < str.length(); i++) {
c = str.charAt(i);
if(c == '{')
return false;
if(c == '(')
stack.push(c);
if(c == '{') {
stack.push(c);
if(c == '}')
if(stack.empty())
return false;
else if(stack.peek() == '{')
stack.pop();
}
else if(c == ')')
if(stack.empty())
return false;
else if(stack.peek() == '(')
stack.pop();
else
return false;
}
return stack.empty();
}
public static …Run Code Online (Sandbox Code Playgroud) 我不知道如何将两个或多个通知分组到一个并显示"你有两条新消息"这样的消息.