我发现了一个bug在GCC 6和7(未在GCC 5)内constexpr功能,这导致不同的结果,如果任一函数获取在编译时(错误的结果),或运行时(正确结果)的计算结果.
#include <iostream>
constexpr int bar(int *b) {
int i = 0;
b[i++] = 1; // GCC produce here an failure.
return 0;
}
constexpr int foo()
{
int tmp[] = {0};
bar(tmp);
return tmp[0];
}
constexpr int cexprI = foo();
int main()
{
std::cout << cexprI << " " << foo() << "\n";
return 0;
}
Run Code Online (Sandbox Code Playgroud)
问题是数组访问中的增量(也发生在减量)操作.
常量表达式的编译时结果为0(错误),运行时结果为1(正确).
任何人都可以确认此错误并报告给:https://gcc.gnu.org/bugzilla/
我无法在那里创建一个帐户User account creation has been restricted..我联系了管理员,但对我来说这个问题很重要.所以它也想通知你.谢谢!
我正在尝试使用GCC 6.2.1构建一些CUDA代码,这是我的发行版的默认编译器(注意:不是CUDA正式支持的GCC版本,所以你可以称之为实验).这是使用GCC 4.9.3和CUDA版本7.5和8.0构建的代码.
好吧,如果我构建以下(接近)最小的示例:
#include <tuple>
int main() { return 0; }
Run Code Online (Sandbox Code Playgroud)
使用命令行
nvcc -std=c++11 -Wno-deprecated-gpu-targets -o main main.cu
Run Code Online (Sandbox Code Playgroud)
我收到以下错误:
/usr/local/cuda/bin/../targets/x86_64-linux/include/math_functions.h(8897): error: cannot overload functions distinguished by return type alone
/usr/local/cuda/bin/../targets/x86_64-linux/include/math_functions.h(8901): error: cannot overload functions distinguished by return type alone
2 errors detected in the compilation of "/tmp/tmpxft_000071fe_00000000-9_b.cpp1.ii".
Run Code Online (Sandbox Code Playgroud)
这是为什么?我该如何纠正/规避这个?
我最近遇到了在升级 debian 测试后编译一段代码的问题,得到了 gcc 6.2.1 编译器。我把它归结为这个简单的例子:
inline int func(void) {
return 0;
}
int main (int argc, char **argv) {
func();
}
Run Code Online (Sandbox Code Playgroud)
该代码不会不与下面的编译:
gcc -o exec code.c # gcc 6.2.1
它失败了:
undefined reference to 'func'
我也在同一台主机上尝试过 gcc 4.8、4.9 和 5,但都失败了。如果我添加,它会编译:
gcc -o exec code.c -O2 # gcc 6.2.1
我真的很好奇为什么它与 -O2 标志一起工作,但不是没有,我希望这能工作?
当我注意到g ++似乎根据所选优化改变结果时,我一直在努力优化性能,当然还在进行回归测试.到目前为止,我认为-O2 -march=[whatever]无论选择何种架构,都应该为数值计算产生完全相同的结果.然而,对于g ++来说似乎并非如此.虽然使用旧架构到ivybridge产生与clang对任何架构相同的结果,但是对于haswell和更新的gcc,我得到了不同的结果.这是gcc中的错误还是我误解了有关优化的内容?我真的很吃惊,因为clang似乎没有表现出这种行为.
请注意,我很清楚差异在机器精度范围内,但它们仍然会干扰我的简单回归检查.
这是一些示例代码:
#include <iostream>
#include <armadillo>
int main(){
arma::arma_rng::set_seed(3);
arma::sp_cx_mat A = arma::sprandn<arma::sp_cx_mat>(20,20, 0.1);
arma::sp_cx_mat B = A + A.t();
arma::cx_vec eig;
arma::eigs_gen(eig, B, 1, "lm", 0.001);
std::cout << "eigenvalue: " << eig << std::endl;
}
Run Code Online (Sandbox Code Playgroud)
编译使用:
g++ -march=[architecture] -std=c++14 -O2 -o test example.cpp -larmadillo
Run Code Online (Sandbox Code Playgroud)
gcc版本:6.2.1
铿锵版:3.8.0
编译为64位,在Intel Skylake处理器上执行.
我有一段以下形式的代码:
typedef enum {A=1,B} EnumType;
int foo (EnumType x)
{
int r;
switch (x) {
case A:
r = 1;
break;
case B:
r = 2;
break;
/*
default:
r = -1;
break;
*/
}
return r;
}
Run Code Online (Sandbox Code Playgroud)
我用GCC 6.3.0编译并收到警告:
$ gcc --version
gcc (MacPorts gcc6 6.3.0_2) 6.3.0
Copyright (C) 2016 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
$ …Run Code Online (Sandbox Code Playgroud) int main() {
string str[5] = "ABCD";
std::cout << str[3] << std::endl;
std::cout << str[0] << std::endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
此代码打印:
A B C D
A B C D
没看懂,怎么str[3]打印ABCD?
编译器:GCC 6.3
使用GCC6和下面的代码片段,这个测试
if (i > 31 || i < 0) {
Run Code Online (Sandbox Code Playgroud)
是false,执行此printf
printf("i > 31 || i < 0 is FALSE, where i=%d", i);
Run Code Online (Sandbox Code Playgroud)
并产生这个非常奇怪的输出(GCC6):
我> 31 || i <0为FALSE,其中i = 32/*奇怪的结果与GCC6!*/
而对于GCC4,我得到:
我> 31 || i <0为真,其中i = 32/*结果Ok GCC4*/
看起来很不错.
怎么会这样??
static int check_params(... input parameters ...) {
/* Note that value can be 0 (zero) */
uint32_t value = ....
int i;
i = __builtin_ctz(value);
if (i …Run Code Online (Sandbox Code Playgroud) 如这个小脚本所示.
#include <stdio.h>
struct student{
short count;
void (*addCount)();
};
void student_addCount(struct student a){
a.count++;
}
int main(){
struct student student;
student.addCount = student_addCount;
student.count = 0;
student.addCount();
student.addCount();
student.addCount();
student.addCount();
student.addCount();
printf("%d\n",student.count);
}
Run Code Online (Sandbox Code Playgroud)
我已经添加了一个指向结构内部函数的指针,但我不知道为什么这会起作用,因为函数'addCount'没有接收任何参数,它实际上累计了指定的次数.
我正在使用GCC 6.3.0在不同的环境中编译此代码,例如ideone.com,wandbox.org和WSL中的编译器.
这是证明它与ideone一起工作. https://ideone.com/Cam4xY