MinGW SEH和MinGW SJLJ有什么区别?
What is the difference between MinGW SEH and MinGW SJLJ?
我刚刚开始学习C和现在安装QT x64(形式在这里:http://tver-soft.org/qt64)。我有两个安装选项:MinGW 4.9.2 SEH
或MinGW 4.9.2 SJLJ
。
问题:安装哪个更好,为什么?
我读了sjlj vs dwarf vs seh有什么区别?和https://wiki.qt.io/MinGW-64-bit#Exception_handling:_SJLJ.2C_DWARF.2C_and_SEH,但什么都不懂(C和编译器语言的新手)。
SJLJ和SEH是两种不同的异常处理系统。
对于具体的差异,您已经看到的资源涵盖了所有内容。
然而,至于哪一个更好安装,选择SJLJ,除非你知道你需要SEH。
2019 Update:在现代系统上,没有理由使用SJLJ,所以上面的建议可能应该被翻转。SEH现在更常见了。但最终,这并不重要,因为在两者之间切换很容易。
SJLJ
SJLJ在体系结构中得到更广泛的支持,并且更加健壮。此外,可以通过使用其他异常处理系统(包括C库)的库抛出SJLJ异常。但是,它有性能损失。
医师
SEH效率更高(没有性能损失),但不幸的是没有得到很好的支持。当通过不使用SEH的库抛出SEH异常时,会导致不好的事情发生。
就您的代码而言,没有真正的区别。如果需要,您可以稍后切换编译器。
我发现了MinGW-w64中SJLJ和SEH异常处理之间的一个区别:只要在运行时至少执行一个try{}块,signal()函数设置的C信号处理程序就不能在SJLJ版本中工作。由于这个问题似乎没有在任何地方描述,我把它放在这里记录。
下面的例子(testrongignals.cpp)演示了这一点。
// This sample demonstrates how try {} block disables handler set by signal()
// on MinGW-w64 with GCC SJLJ build
#include <signal.h>
#include <iostream>
int izero = 0;
static void SIGWntHandler (int signum)//sub_code)
{
std::cout << "In signal handler, signum = " << signum << std::endl;
std::cout << "Now exiting..." << std::endl;
std::exit(1);
}
int main (void)
{
std::cout << "Entered main(), arming signal handler..." << std::endl;
if (signal (SIGSEGV, (void(*)(int))SIGWntHandler) == SIG_ERR)
std::cout << "signal(OSD::SetSignal) errorn";
if (signal (SIGFPE, (void(*)(int))SIGWntHandler) == SIG_ERR)
std::cout << "signal(OSD::SetSignal) errorn";
if (signal (SIGILL, (void(*)(int))SIGWntHandler) == SIG_ERR)
std::cout << "signal(OSD::SetSignal) errorn";
// this try block disables signal handler...
try { std::cout << "In try block" << std::endl; } catch(char*) {}
std::cout << "Doing bad things to cause signal..." << std::endl;
izero = 1 / izero; // cause integer division by zero
char* ptrnull = 0;
ptrnull[0] = ' '; // cause access violation
std::cout << "We are too lucky..." << std::endl;
return 0;
}
构建:
g++ test_signals.cpp -o test_signals.exe
期望输出为:
Entered main(), arming signal handler...
In try block
Doing bad things to cause signal...
In signal handler, signum = 8
Now exiting...
当我使用MigGW-w64 SJLJ变体构建时的实际输出是:
Entered main(), arming signal handler...
In try block
Doing bad things to cause signal...
应用程序在一段延迟后被静默终止。也就是说,信号处理程序不会被调用。如果try{}块被注释掉,信号处理程序被正确调用。
当使用MinGW-w64 SEH变体时,它的行为与预期一致(调用信号处理程序)。
我不清楚为什么会出现这个问题,如果有人能给我一个解释,我将不胜感激。
- C++中std::resize(n)和std::shrink_to_fit之间的区别
- 在VS代码中交叉编译Windows与Linux上的MinGW的SDL程序
- int(c) 和 c-'0' 之间的区别。C++
- 向量 <int> a {N, 0} 和 int arr a[N] = {0} 的时间复杂度有什么区别
- C++ - "!pointer"和"pointer == nullptr"的区别?
- C++ 使用 assign 函数的字符串与直接使用 '=' 更改值的字符串之间的区别
- std::atomic和std::condition_variable wait,notify_*方法之间的区别
- 如何将C++中的库和头与MinGW一起使用
- 为什么与常规GCC不同,即使有"学究性错误",MinGW-GCC也能容忍丢失的返回类型
- 在 .h 文件中的类中声明静态变量和在.cpp文件中声明"global"变量有什么区别
- 我是C++编程的新手,这些代码之间有什么区别,我应该使用哪一个
- 在 const 函数中通过引用和指针返回之间的区别
- 我想知道长双倍和双倍之间的区别
- 返回常量对象引用 (getter) 和仅返回字符串有什么区别?
- 返回递归调用和仅递归调用的区别
- 无法在windows上使用mingw将sqlite3与c连接
- Qt:remove() 和 rmdir() 有什么区别
- VS c++和MinGW实现双重类型有什么区别
- Qt的MinGW,Code::Blocks的MinGW和MinGW本身有什么区别吗?
- MinGW SEH和MinGW SJLJ有什么区别?