草庐IT

行为树

全部标签

c++ - 不使用虚函数的多态行为

我正在为微Controller开发一种玩具语言,我有一个函数类,它有11个虚方法,称为“调用”,从无参数到10个参数都采用基对象类并返回对象类(函数还扩展目的)。每当我的语言中有函数定义时,我都会定义一个类来扩展Function类并根据其参数实现其中​​一个虚拟方法。每当我想调用一个函数时,我只是将它转换为Function*并使用它的参数调用它的调用方法。所以我得到了类似下面的东西,classobject{}//othertypesthatextendobjectclassFunction:publicobject{virtualobject*call(){}virtualobject

C++ union 的未定义行为

只是阅读了一些匿名结构以及它是如何不标准的以及它的一些一般用例是未定义的行为...这是基本情况:structPoint{union{struct{floatx,y;};floatv[2];};};因此写入x然后从v[0]读取将是未定义的,因为您希望它们相同,但事实可能并非如此。不确定这是否在标准中但属于同一类型...union{float一个;floatb;};写入a然后从b读取是否未定义?也就是说,标准是否说明了数组和相同类型的顺序变量的二进制表示。 最佳答案 标准说从union其他元素中的任何元素读取比最后一个写的是未定义的行为

c++ - 如何隔离只允许创建为单例的不良行为 3rd-party c-lib?

目前我正在开发一个原生Cnodejs插件来包装一个3rdparty闭源c-lib并将其暴露给nodejs。到目前为止一切顺利。我的解决方案有效,并且可以调用和使用native代码。当随后调用这些函数时,会出现一个问题。3rdParty库似乎总是为其运行时对象分配相同的结构(?;说:内存中的相同位置)。我能以某种方式“沙盒化”这个3rdparty-lib吗?有解决这个问题的模式吗?可能特定于nodejs-addon开发,因为nodejs是单线程、单进程应用程序。在这种情况下,一般建议似乎在单独的进程中运行3rdParty库,例如此处所述:Isolatingandmultiplyinsta

c++ - 使用 MATLAB 'dos' 命令调用并行化可执行文件的行为不同于独立可执行文件

当我尝试使用MATLAB的dos()命令调用并行化可执行文件时,它不会运行可执行文件并返回错误。就其本身而言,这个简单的C++程序完全按照您的预期运行:/*Serial.exe*/#includeintmain(void){std::cout结果:Apple!Banana!这个也是:/*Parallel*/#include#includeintmain(void){std::cout结果:Apple!Banana!Banana!Banana!Banana!Banana!Banana!Banana!Banana!现在,我尝试使用以下MATLAB脚本调用这两个程序:%%MATLABcall

c++ - uint8_t VS uint32_t 不同的行为

我目前正在从事需要使用uint8_t的项目。我发现了一个问题,有人可以向我解释为什么会这样吗?//usingDIGIT_T=std::uint8_t;usingDIGIT_T=std::uint32_t;std::uint8_tbits=1;DIGIT_Ttest1=~(DIGIT_T)0;std::cout>bits);std::cout在这种情况下,输出符合预期ffffffff7fffffff但是当我取消注释第一行并使用uint8_t时,输出是ffff这种行为给我带来了麻烦。感谢您的帮助。马立克 最佳答案 正如评论中已经详细解释

c++ - GCC `-fsanitize=bounds` `std::array` 的奇怪行为

我正在尝试使用-fsanitize=bounds选项找出代码中的越界问题,但我遇到了奇怪的行为:例如在下面的代码中:#include#includeintmain(int,char**){std::arraya;constcharb=a[X];//X使用以下选项编译:$g++-std=c++11-fsanitize=bounds-O0main.cpp-omain。如果我尝试访问索引大于1的元素,则会报告错误:/usr/include/c++/5/array:53:36:运行时错误:索引2超出类型“char[1]”的范围。但是如果我尝试访问索引为1的元素,一切正常并且没有错误报告。这是预

c++ - 在 libc++ 和 glibc 中解析 double 时不一致的字符串流行为

使用gcc编译以下示例时和clang...#include#includeintmain(){doubleval;std::stringstreamss("6.93758e-310");ss>>val;std::cout...我有不同的行为:对于gcc,流的失败位ss.fail()未设置,而为clang设置可能需要注意的是,在这两种情况下,errno都设置为ERANGE。此外,我在本地使用clang和gcc时会得到相同的行为,除非我明确使用libc++和clang(-stdlib=libc++)而不是glibc。我不确定正确的行为是什么,但我觉得它应该是一致的。

c++ - G++ 和 __attribute__((optimize)) 不改变调试器行为

我正在尝试使用__attribute__来允许一个函数在本质上使用与其余代码不同的标志进行编译。例如:#include#includevoidMyNormalFunction();voidMyDebugabbleFunction()__attribute__((optimize(0)));voidMyNormalFunction(){std::couta;for(unsignedinti=0;ia;for(unsignedinti=0;i我正在使用-g-O2构建,但我希望能够理智地调试MyDebugabbleFunction()—所以我使用了__attribute__((optimiz

c++ - 在重载决议方面,xvalue 和 prvalue 之间的行为差​​异的一个具体、简洁的例子是什么?

几个星期以来,我一直在仔细研究右值和右值引用。我越来越有信心,我对以下两者之间的区别有了一定的了解:定义变量或函数参数的类型(即intx;与int&&x=…;表达式的表达式类别,包括那些可能使用先前定义的参数的表达式(即给定函数定义A&&foo(),以及给定的表达式仅包含foo()的表达式类别是“xvalue”)子表达式在包含表达式中使用时的子表达式求值结果的类型(即,给定foo的相同定义,在包含表达式中使用时,子表达式foo()的类型是A(不是A&&))。我的问题是关于xvalue表达式和prvalue表达式(这两个表达式类别都是右值)之间的区别。给定:classA{};A&&foo

c++ - 在哪里可以查看 GCC 对实现定义行为的实现?

由于C++标准在很多方面都非常模糊,所以我想看看不同编译器的具体实现。目前,我想知道GCC是如何分配和对齐位域的。对于MSVisualC++编译器,这非常简单:有一个nicepage在关于位字段的用户手册中解释了所有开放的分配/对齐问题,甚至还有数字和示例。我只想要GCC的相同信息,但它似乎要复杂得多。有一个page在GCC手册中仅声明“由ABI确定”。然后我们有一些关于ABIpolicyandguidelines的信息其中包含指向名为ItaniumC++ABI的文档的链接在Github上。现在,在这份文档中,我们可以找到以下内容:“位域是根据底层CpsABI的要求分配的”。这就是我被