[英]How come this both loop runs equally fast when compiled with -O3, but not when compiled with -O2?
[英]Exception not caught when compiled with -O2 or -O3 flag
使用帶有-O2或-O3標志的GCC編譯以下示例時遇到了問題。
#include <string>
#include <stdexcept>
#include <iostream>
class Args {
public:
Args(int, char** argv);
const std::string get_arg() const;
private:
int argc_;
int index_ = 0;
char** argv_;
};
Args::Args(int argc, char** argv):
argc_(argc),
argv_(argv)
{
}
const std::string Args::get_arg() const
{
if (index_ >= argc_) {
throw std::out_of_range("Out of range.");
}
return std::string(argv_[index_]);
}
int main(int, char** argv)
{
Args args(0, argv);
try {
std::string a = args.get_arg(); // Must throw.
std::cout << "After get_arg(): " << a << std::endl;
} catch(std::out_of_range) {
std::cout << "Catched" << std::endl;
}
return 0;
}
使用-O3標志編譯示例時
g++ -std=c++11 -Wall -pedantic -Wextra -O3 -g0 -o args args.cpp
std::out_of_range
out_of_range異常未捕獲在catch塊中。 輸出是
terminate called after throwing an instance of 'std::out_of_range'
what(): Out of range.
Abort trap
如果使用GCC編譯不帶-O2或-O3的示例,則一切正常
g++ -std=c++11 -Wall -pedantic -Wextra -g0 -o args args.cpp
或與CLang
clang++ -std=c++11 -Wall -pedantic -Wextra -O3 -g0 -o args args.cpp
clang++ -std=c++11 -Wall -pedantic -Wextra -g0 -o args args.cpp
GCC版本:(FreeBSD端口集合)5.4.0
CLang版本:4.0.0
操作系統:FreeBSD 11.1(amd64)
錯誤在哪里?
感謝您的瀏覽。 我在這篇文章https://stackoverflow.com/a/33279425/8838989中找到了正確的解決方案。 當示例使用標志-Wl,-rpath=/usr/local/lib/gcc5
g++5 -std=c++11 -Wall -pedantic -Wextra -O3 -g0 -Wl,-rpath=/usr/local/lib/gcc5 -o args args.cpp
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.