草庐IT

c++ - Clang 是否比跨平台的 GCC 更具确定性?

我正在考虑用C++编写多用户RTS游戏(部分)的可行性。我很快发现,一个硬性要求是游戏模拟必须完全确定服务器和所有客户端的最后一点,以便能够将网络通信限制为用户输入,而不是游戏状态本身.由于每个人都有不同的计算机,这似乎是一个难题。那么,是否有一些“神奇”的方法可以让C++编译器创建一个在Linux(服务器)、Windows和Mac上完全确定的可执行文件?我认为两个主要的OSSC++编译器是GCC和Clang,所以我想知道在这方面是否一个比另一个表现更好。我也会对任何可用于验证C++确定性的测试套件感兴趣。[编辑]所谓确定性,我的意思是编译后的程序,给定相同的初始状态,并以相同的顺序输

c++ - gcc 4.5.1 虚拟继承问题

让我们从代码片段开始:#includestructGod{God(){_test=8;}virtual~God(){}int_test;};structBase1:publicvirtualGod{//Base1(){std::cout_test_test使用GCC4.5.1和4.6.1编译Derived类的构造函数之间的唯一区别是第一个明确说明应该调用哪个Base1构造函数。我希望main()中的两个cout都打印8。不幸的是第一个打印0!。为什么?如果我启用Base1构造函数的显式定义,它可以解决问题。如果我在派生类定义(派生类:publicA1,publicA2)中删除虚拟继承,

c++ - constexpr(gcc) 错误 - 错误 : a brace-enclosed initializer is not allowed here before '{' token

structX{constexprstaticchara1[]="hello";//Okayconstexprstaticconstchar*a2[]={"hello"};//Error};intmain(){}用gcc编译报错:error:abrace-enclosedinitializerisnotallowedherebefore'{'token这是对constexpr的非法使用吗?编辑我尝试了3个不同版本的gcc,它是在我拥有的最新4.7.0上编译的(我刚刚下载了它,我使用的是mingw-w64),所以它看起来是一个固定的错误(链接到bug会很好!)。4.7.020120311

c++ - GCC arm-none-eabi (Codesourcery) 和 C++ 异常

我正在使用Raisonance的Ride7/Codesourcery(又名SourceryCodeBenchLite)和一blockSTM32F4板来开发裸机HMI平台。我将在此系统中使用C++异常,但我抛出的任何异常都以写入stderr的“递归调用终止”错误结束。重现问题的代码:(main.cpp)intmain(void){try{throw1;}catch(...){printf("caught");}}我已经尝试过Raisonance和其他资源来寻求解决方案,但没有收到任何可操作的帮助。潜在问题/解决方案1:我在其他论坛上问过,他们提到我需要在我的启动程序集文件中调用静态构造来

c++ - gcc 4.6 和 4.7 之间的默认构造函数差异

在GCC4.6.1上,当我声明一个具有默认构造函数的我自己类型的实例时,如果我实例化一个该类型的对象并用大括号(如Foomy_foo{};)初始化它,POD成员如果没有声明其他构造函数,则该类中的将仅进行零初始化。如果除了默认构造函数之外没有其他构造函数,它们将像预期的那样进行零初始化。但是,在GCC4.7.3上,零初始化以任何一种方式发生,这是我预期的行为。这里有什么区别?这是编译器错误吗?这两个GCC版本都支持C++11标准的默认构造函数。没有真正需要坚持使用旧的GCC版本,但我想了解这里发生了什么。注意:我默认了主构造函数op=。并复制ctor只是为了保持类型可用于可变参数函数(

c++ - 在 ARM 平台上正确检测混合端浮点格式

我最近遇到了第三方库的问题,该库使用以下代码在ARM平台上测试混合端浮点格式:#ifdefined(__arm__)&&!(__ARM_EABI__)此检查在Android平台上错误地检测到混合端格式,但在iOS平台上工作正常。经过一番研究,我发现debianArmEabiPortdocument在GCC浮点预处理器宏部分中包含以下内容(强调我的):Whenportingcodeto"armel",thefollowingpreprocessormacrosareinteresting:__VFP_FP__meansthatthefloatingpointformatinuseisth

c++ - gcc 中的错误,或 clang/MSVC 中的扩展

以下代码片段可以在clang和MSVS中编译,但不能在gcc中编译。templateclassclone_ptr;templateclone_ptrmake_cloned(Args...args);//note:everythingnotneededforexamplecutout,so//thisclassisneithercompletenorcorrecttemplateclassclone_ptr{public:clone_ptr():ptr(nullptr){}operatorbool(){returnptr!=nullptr;}T*operator->(){returnpt

c++ - gcc 的 std::bind 在哪里将参数复制到数据结构中?

为了了解std::bind分配内存的情况,我查看了thisanswer,这给出了一些直觉,但我想要更详细的了解,所以我去查看了gcc的源代码。我正在检查followingsourcecode对于来自C++标准库的gcc实现的std::bind。/***@briefFunctiontemplateforstd::bind.*@ingroupbinders*/templateinlinetypename_Bind_helper::value,_Func,_BoundArgs...>::typebind(_Func&&__f,_BoundArgs&&...__args){typedef_Bi

c++ - 如何确定 UBSAN 是否已使用 clang 或 gcc 编译?

我们使用以下代码来确定是否在编译时为clang和gcc指定了-fsanitize=address。我们如何确定是否指定了-fsanitize=undefined?boolisSanitized=false;#ifdefined(__has_feature)#if__has_feature(address_sanitizer)isSanitized=true;#endif#elifdefined(__SANITIZE_ADDRESS__)isSanitized=true;#endif 最佳答案 我建议您将此作为一个错误提交给ASang

c++ - 为什么 gcc 对一个版本执行尾调用优化而不对另一个版本执行尾调用优化?

在试验尾调用优化(tco)时,我偶然发现了以下奇怪的示例:unsignedlonglongintfac1(unsignedlonglongintn){if(n==0)return1;returnn*fac1(n-1);}事实上,我印象深刻的是,gccwasable在这里执行tco(使用-O2标志),因为它不是那么简单:fac1(unsignedlonglong):testq%rdi,%rdimovl$1,%eaxje.L4.L3:imulq%rdi,%raxsubq$1,%rdijne.L3repret.L4:repret但是,在将返回类型从unsignedlonglongint更改为