草庐IT

c++ - gcc -O0 在矩阵大小为 2 的幂(矩阵转置)上优于 -O3

(出于测试目的)我写了一个简单的方法来计算nxn矩阵的转置voidtranspose(constsize_t_n,double*_A){for(uinti=0;i当使用优化级别O3或Ofast时,我希望编译器展开一些循环,这将导致更高的性能,尤其是当矩阵大小是2的倍数时(即,每次迭代都可以执行双循环体)或类似情况。相反,我测量的结果恰恰相反。2的幂实际上显示了执行时间的显着峰值。这些尖峰也以64为固定间隔,以128为间隔更明显,依此类推。每个尖峰都延伸到相邻的矩阵大小,如下表所示sizentime(us)10202649102128151022310010235428102415791

c++ - 这些关于 GCC 优化的评论是否有效?

在DemystifyingtheRestrictKeyword的底部这是一个奇怪的建议吗:DuetotheorderinwhichschedulingisdoneinGCC,itisalwaysbettertosimplifyexpressions.Donotmixmemoryaccesswithcalculations.Thecodecanbere-writtenasfollows:然后有一个例子本质上是在改变这个velocity_x[i]+=acceleration_x[i]*time_step;进入这个constfloatax=acceleration_x[i];//Thenth

c++ - 这些关于 GCC 优化的评论是否有效?

在DemystifyingtheRestrictKeyword的底部这是一个奇怪的建议吗:DuetotheorderinwhichschedulingisdoneinGCC,itisalwaysbettertosimplifyexpressions.Donotmixmemoryaccesswithcalculations.Thecodecanbere-writtenasfollows:然后有一个例子本质上是在改变这个velocity_x[i]+=acceleration_x[i]*time_step;进入这个constfloatax=acceleration_x[i];//Thenth

c++ - 是否应该通过 std::cin 将负数读入 unsigned 失败(gcc,clang 不同意)?

例如,#includeintmain(){unsignedn{};std::cin>>n;std::cout输入-1时,clang6.0.0输出00而gcc7.2.0输出42949672951。我想知道谁是正确的。或者也许两者都是正确的标准没有指定这一点?如果失败,我的意思是(bool)std::cin被评估为假。clang6.0.0也无法输入-0。从Clang9.0.0和GCC9.2.0开始,在Clang的情况下使用libstdc++或libc++的两个编译器都同意上述程序的结果,与C++版本无关(>=C++11)使用并打印42949672951即他们将值设置为ULLONG_MAX并

c++ - 是否应该通过 std::cin 将负数读入 unsigned 失败(gcc,clang 不同意)?

例如,#includeintmain(){unsignedn{};std::cin>>n;std::cout输入-1时,clang6.0.0输出00而gcc7.2.0输出42949672951。我想知道谁是正确的。或者也许两者都是正确的标准没有指定这一点?如果失败,我的意思是(bool)std::cin被评估为假。clang6.0.0也无法输入-0。从Clang9.0.0和GCC9.2.0开始,在Clang的情况下使用libstdc++或libc++的两个编译器都同意上述程序的结果,与C++版本无关(>=C++11)使用并打印42949672951即他们将值设置为ULLONG_MAX并

c++ - GCC 和 Clang 不在 C++17 中编译 std::hash<std::nullptr_t>

开启https://en.cppreference.com/w/cpp/utility/hash它说从C++17开始Eachstandardlibraryheaderthatdeclaresthetemplatestd::hashprovidesenabledspecializationsofstd::hashforstd::nullptr_tandallcv-unqualifiedarithmetictypes(includinganyextendedintegertypes),allenumerationtypes,andallpointertypes.所以,一个C++17兼容的编

c++ - GCC 和 Clang 不在 C++17 中编译 std::hash<std::nullptr_t>

开启https://en.cppreference.com/w/cpp/utility/hash它说从C++17开始Eachstandardlibraryheaderthatdeclaresthetemplatestd::hashprovidesenabledspecializationsofstd::hashforstd::nullptr_tandallcv-unqualifiedarithmetictypes(includinganyextendedintegertypes),allenumerationtypes,andallpointertypes.所以,一个C++17兼容的编

c++ - GCC 的 "vstring"是什么?

我阅读了一些GCC错误报告,那里的人在谈论“vstring”。上网搜索发现http://gcc.gnu.org/onlinedocs/libstdc++/libstdc++-html-USERS-4.2/vstring_8h.html.有人可以详细说明它的用途和用途吗?为什么要使用它而不是std::string? 最佳答案 GCC的vstring是一个通用的字符串类,在GCC4.1的libstdc++中引入实现。兼容std::basic_string,以及这些额外的细节:提供了两个基类:默认的避免引用计数,并针对短字符串进行了优化;

c++ - GCC 的 "vstring"是什么?

我阅读了一些GCC错误报告,那里的人在谈论“vstring”。上网搜索发现http://gcc.gnu.org/onlinedocs/libstdc++/libstdc++-html-USERS-4.2/vstring_8h.html.有人可以详细说明它的用途和用途吗?为什么要使用它而不是std::string? 最佳答案 GCC的vstring是一个通用的字符串类,在GCC4.1的libstdc++中引入实现。兼容std::basic_string,以及这些额外的细节:提供了两个基类:默认的避免引用计数,并针对短字符串进行了优化;

c++ - 为什么虚拟表中有两个虚拟析构函数,非虚拟函数的地址在哪里(gcc4.6.3)

我实现了一个简单的测试来检查派生类的内存等级,所以我发现派生类的虚拟表中有两个虚拟析构函数地址。谁能给我解释一下?代码:#include#include#includeusingnamespacestd;classBase1{public:Base1():a(1){}virtual~Base1(){cout我找到了f()andf2()结果如下:~Derive~Base2~Base1~Derive~Base2~Base1是派生类的析构函数。为什么有两个?还有一个问题:非虚成员函数的地址在哪里?我发现派生类的内存中不存在非虚函数地址。它在哪里? 最佳答案