【问题标题】:Limits for function call in C++ [closed]C ++中函数调用的限制[关闭]
【发布时间】:2017-11-09 06:54:10
【问题描述】:

我在 Ubuntu 上使用 Qt 并进行一项需要多次执行我的程序的研究测试。我决定使用线程来优化时间消耗,但是当参数很大时我遇到了问题。首先,我认为这是线程或对象编程的问题,所以我决定简化一些事情以检测问题的根源。我找到了导致所有问题的功能。我把它放在main中,并用随机参数顺序执行了很多次。它在 146000-156000 时间之间崩溃。 (为了确保我已经使用崩溃但正常执行的参数重新执行了该函数)。

我注意到将参数对象作为全局变量可以提高时间(2个对象为参数时为78000,全局时为150000左右),其他参数为简单整数

我使用许多向量作为函数的局部变量,但我认为这不是原因,因为它们在函数完成处理时被破坏。

这次崩溃的原因是什么?

for (int i=0;i<600000; i++){

    int _trx=-1020+((rand())%2039);
    int _try=-1020+((rand())%2039);
    double _or=(rand()%36000)/100;
    int _scale=rand()%2 -1 ;
    std::cout << i <<": trans x: " << _trx << " | trans y: " << _try << " | or: " << _or  << std::endl;

    double _score= Test(1,_trx,_try, _or,1,0,5,5,1024);
    cout <<" |score: " << _score << endl;

}

【问题讨论】:

  • 很难说没有代码发布
  • 多线程问题的典型情况是偶发错误(由于多线程中的非确定性)。在 C++ 中,您从编译器或标准库中获得的帮助较少。您只能“擦亮眼睛”或切换到具有更好 MT 支持的语言(例如 Rust)。说真的:请编辑您的问题并发送MCVE
  • 如果在大约相同数量的迭代后每次都发生崩溃,这可能是一些未检查的“超出”问题(例如内存不足)的提示。要检查这一点,查看堆栈跟踪(核心转储)可能会有所帮助。
  • 使用valgrind 发现内存泄漏。
  • 编译所有警告和调试信息:g++ -Wall -Wextra -gwith GCC。阅读undefined behavior,因为您可能有一些。 使用调试器gdb,下次您提出关于 SO 的问题时,请提供一些 minimal reproducible example

标签: c++ function parameters call


【解决方案1】:

每个人都知道,在大约 50000 次调用之后,C++ 调用系统变得不可靠,您需要停止并启动另一个程序。

不是

C++ 函数调用确实有效。

重新阅读内化这句话。编程进步对你很重要。

在我看来,您需要解决的最大问题是在您的大脑中,而不是在代码中。如果您在遇到问题时首先想到的是其他人的代码(例如编译器、操作系统)或硬件是原因,那么您就不会在编程方面走得太远。

一旦您准备好承认您的代码是问题所在,请在问题中添加更多信息,提供源 sn-p、确切的错误消息、更多上下文。

从你提供的几个症状来看,我疯狂的猜测是内存泄漏,你的程序因内存耗尽而死,但没有更多信息,没有人能确定。

【讨论】:

  • 内存耗尽是我的第一个想法。关于多线程,我的第二个想法是静音也是一种有限的资源。想多了,肯定会发现更多“天马行空的猜测”……
  • @Scheff:我认为作者需要解决的最大问题是在他/她的大脑中,而不是在代码中。如果您在遇到问题时首先想到的是认为其他人的代码是源代码,那么您就不会在编程方面走得太远。
  • 我没有说 pb 不在我的代码中..在询问 c++ 函数的限制之前,我做了很多搜索和测试..我完全没有错误..在大多数尝试函数终止(我在函数中有一个 cout 一步一步)..我想到了为什么我要问局部变量是否真的在函数末尾被破坏或者它可以是 pb 的记忆分配变量..我只想确保调用函数没有限制,以避免浪费更多时间进行搜索
  • "每个人都知道,在大约 50000 次调用之后,C++ 调用系统变得不可靠,您需要停止并启动另一个程序。" ??我不明白这个..这是真的吗?如果是这样,这可能是原因,因为我说的是 150000 电话!
  • @2K_tf "每个人都知道,在大约 50000 次调用之后,C++ 调用系统变得不可靠,您需要停止并开始另一个程序。"这是个笑话。考虑下面的大 NOT
猜你喜欢
  • 2012-12-16
  • 2012-11-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-20
  • 2015-02-10
  • 1970-01-01
  • 2017-07-29
相关资源
最近更新 更多