草庐IT

C++标准

全部标签

c++ - ABI 与 C++ 标准

我试图了解ABI(比如SystemV)和C++标准的区别。所以C++标准只是确定合法的C++,以便编译器可以将其转换为足够的汇编代码。ABI然后规范这个汇编代码如何与x86架构交互?这是两者之间更高层次的比较吗?我问的原因是对低延迟软件感兴趣,我想知道读取ABI会包含多少值(value)? 最佳答案 该标准根据您编写的代码定义程序应该做什么。ABI定义了特定平台的实现方式,以便在不同运行(可能由不同的编译器/版本)编译的代码可以交互。也就是说,当你写:voidf(inti){std::cout标准定义了行为:对该函数的调用将导致参数

c++ - 标准是否定义了 `a[i]` 的类型,其中 `a` 是 `T [M][N]`?

我偶尔会使用多维数组,并且很好奇标准(C11和/或C++11)关于使用比为数组声明的“维度”更少的“维度”进行索引的行为。给定:inta[2][2][2]={{{1,2},{3,4}},{{5,6},{7,8}}};标准是否说明了a[1]或a[0][1]是什么类型,是否合法,以及它是否应该正确索引子-数组如预期?auto&b=a[1];std::cout 最佳答案 m[1]只是int[2][2]类型。同样,m[0][1]就是int[2]。是的,作为子数组的索引按照您认为的方式工作。 关于

c++ - 为什么 C 中内置类型的初始化和赋值没有区别?

我正在看一本书,它说C中的内置类型的初始化和赋值之间没有区别。或C++,但是像string这样的类型在C++,有区别。为什么?为什么C中的内置类型没有区别?? 最佳答案 因为像int这样的标准类型没有构造函数。这些intx=123;inty;y=123;相同(开始时,y会有一些随机/垃圾值)。在创建一个对象时会调用它的构造函数。所以,例如:std::strings="123";std::stringy;y="123";s将立即创建并初始化,而y将被创建,其值将被初始化(基于std::string的构造函数),稍后,它们将在opera

c++ - 全局常量定义的顺序

我想这个问题已经有人问过了,但我找不到。如果我使用宏而不是像这样的常量:#defineA0#defineB(A+1)#defineC(B+A)然后它保证以严格的顺序定义(A然后B然后C)。但是如果我改用consts会发生什么?constintA=0;constintB=A+1;constintC=A+B;如果它在函数范围内-没问题。但是全局范围呢?据我所知,不能保证全局变量的定义顺序。那么常量呢?我认为这是阻止我使用常量而不是宏的最后一件事。(我也很好奇C和C++在这个特定问题上是否存在任何差异)。UPD:问题应该是这样的:C和C++在这件事上有什么区别(如果有的话)?

c++ - 是否有任何 C 或 C++ 编译器不将 wctrans_t 和 wctype_t 定义为类型 wchar_t 的原因?

实际上,我正在比较编程语言之间的数据类型,这是我在阅读C和C++标准时遇到的问题。引用自C11,wctrans_tisascalartypethatcanholdvalueswhichrepresentlocale-specificcharactermappingswctype_tisascalartypethatcanholdvalueswhichrepresentlocale-specificcharacterclassifications短语ascalartype表示C11不限制wctrans_t和wctype_t为特定标量类型。我的MinGWGCC4.8实现了wctrans_t

c++ - XOR 交换算法中运算符的未定义行为?

voidswap(int*a,int*b){if(a!=b)*a^=*b^=*a^=*b;}因为上面的*a^=*b^=*a^=*b只是*a=*a^(*b=*b^(*a=*a^*b)),可以(例如)在第三个*a之前对第二个*a进行求值(对于XOR)修改(由=)?用C99/C11/C++98/C++11写有关系吗? 最佳答案 C++11标准说:5.17/1:Theassignmentoperator(=)andthecompoundassignmentoperatorsallgroupright-to-left.(...)theassi

c++ - 如何将 double 转换为标准的 'long double'

如何按照C++标准将double转换为longdouble。我认为像这样转换不是正确的方法吗?doublevalue=1.2;longdoublenewValue=(longdouble)value; 最佳答案 这会很好地工作,但它不会神奇地在newValue中创建额外的精度。也就是说,它不会产生与以下相同的结果:longdoublenewValue=1.2L;这会将newValue设置为更接近1.2。 关于c++-如何将double转换为标准的'longdouble',我们在Stack

c++ - 参数列表中的 C 函数声明

我在C代码中发现了一些令人困惑的东西structSomeStruct{//...void(*f)(constvoid*x);};voiddo_some(voidf(constvoid*x)){//what?structSomeStruct*v;//...v->f=f;}据我所知,do_some采用函数而不是函数指针。但是voiddo_some(void(*f)(constvoid*x))在实践中有什么区别?我应该什么时候使用它?这在C++中允许吗? 最佳答案 没有区别。这只是语法糖。它在C和C++中都是允许的。函数参数只是被编译器重

c++ - 线程安全标准 :list C++

我是多线程的新手,我正在尝试简单地使一些std:lists线程安全。每当将项目添加到列表或从列表中删除时执行mutex.lock()和mutex.unlock()就足够了吗?同样,我只是想让它们成为线程安全的。谢谢 最佳答案 为了安全起见,您必须保护对列表的所有访问。虽然在没有锁的情况下从列表中读取不会损坏列表,但如果在另一个线程正在读取列表时修改了列表,则任何一个线程都可能损坏(即崩溃或产生不正确的结果)。您必须对您希望内容稳定的整个代码范围保持锁定。如果另一个线程可以随时删除或重新排序任何元素,那么这包括您对其内容具有实时迭代器

c++ - 为什么 gcc 不为我决定内联或不内联这个功能?

从网上的一些话我知道GCC很聪明,可以决定是否内联一个函数。inline关键字只是一个提示:GCC可以内联一个普通函数,而不能内联一个内联函数。但是对于我项目中的这个功能:structvb_pos{union{struct{intoffset;intl;};unsignedlonglongg_offset;};};staticinlinevoidvi_write_vtail_smart(structvi*vi){structvb_pos*vhead,*vtail,*cursor;vhead=&vi->v_head;vtail=&vi->v_tail;cursor=&vi->cursor