Questions tagged «c++»

C ++是一种通用编程语言。它最初被设计为C的扩展,并且具有类似的语法,但是现在它是一种完全不同的语言。使用此标记可解决有关将要使用C ++编译器编译的代码的问题。对于与特定标准修订版[C ++ 11],[C ++ 14],[C ++ 17]或[C ++ 20]等相关的问题,请使用特定于版本的标记。

4
什么会使C ++ RTTI不受欢迎?
在查看LLVM文档时,他们提到他们使用“ RTTI的自定义形式”,这就是他们拥有isa<>,cast<>和dyn_cast<>模板功能。 通常,读到库重新实现某种语言的某些基本功能后,这会产生可怕的代码味道,并且会被邀请运行。但是,这就是我们所说的LLVM:这些家伙正在研究C ++编译器和C ++运行时。如果他们不知道自己在做什么,那我就很困惑,因为我更喜欢Mac OS附带clang的gcc版本。 尽管如此,由于经验不足,我仍然想知道普通RTTI的陷阱是什么。我知道它仅适用于具有v表的类型,但这仅引发两个问题: 由于您只需要一个虚拟方法来拥有一个vtable,为什么他们不只是将一个方法标记为virtual?虚拟析构函数似乎擅长于此。 如果他们的解决方案不使用常规的RTTI,是否知道如何实现?
67 c++  llvm  rtti 


4
在C ++ 11中对齐内存的推荐方法是什么
我正在研究单生产者单消费者环形缓冲区实现,我有两个要求: 将单个分配的环形缓冲区实例与缓存行对齐。 将环形缓冲区中的字段与高速缓存行对齐(以防止错误共享)。 我的课看起来像这样: #define CACHE_LINE_SIZE 64 // To be used later. template<typename T, uint64_t num_events> class RingBuffer { // This needs to be aligned to a cache line. public: .... private: std::atomic<int64_t> publisher_sequence_ ; int64_t cached_consumer_sequence_; T* events_; std::atomic<int64_t> consumer_sequence_; // This needs to be aligned to a cache …

1
没有“右值引用*此”功能的解决方法
我在可移动对象周围有一个代理容器类,并希望该代理能够隐式地产生对基础对象的右值引用,但仅当代理自身被移动时才是如此。 我相信我将能够按照建议n2439 “将移动语义扩展到* this”来实现此行为,但是它在gcc发行版中尚不可用,并且将有一段时间。 下面的代码是我最终的目标,但是目前无法实现。在我可以使用此功能之前,是否有任何等效的解决方法? template< class T > struct movable_proxy { operator T&&() && { return std::move(value); } operator const T&() const& { return value; } private: T value; };

7
C ++枚举的使用是否比整数慢?
这确实是一个简单的问题: 我正在编写Go程序。我应该用aQVector<int>或a代表董事会QVector<Player>吗 enum Player { EMPTY = 0, BLACK = 1, WHITE = 2 }; 我想当然会发现,使用Player而不是整数会更慢。但是我想知道还有多少,因为我相信使用enum是更好的编码。 我已经完成了一些有关分配和比较Player的测试(相对于int) QVector<int> vec; vec.resize(10000000); int size = vec.size(); for(int i =0; i<size; ++i) { vec[i] = 0; } for(int i =0; i<size; ++i) { bool b = (vec[i] == 1); } QVector<Player> vec2; vec2.resize(10000000); …


7
在C ++中返回字符串的最佳方法是什么?
我的问题很简单:如果我有一个Man类,并且我想定义返回man名的成员函数,我应该选择以下两个变体中的哪个? 第一: string name(); 第二: void name(/* OUT */ string &name); 第一种变体效率低下,因为它会产生不必要的副本(局部变量->返回值->变量左侧的变量)。 第二个变种看起来很有效,但是让我哭泣 string name; john.name(name); 而不是简单 string name(john.name()); 那么,我应该选择哪种变体?在效率和便利性/可读性之间应该如何取舍? 提前致谢。
67 c++  string 

6
MSVC -Wall中标准标头中的数千条警告是怎么回事?
有人似乎建议您使用-Wall,但是当我在一个只有main.cpp并包含一些包含项的小型测试项目上进行操作时,我在标准标头或Windows标头中收到5800条警告。 那是预期的行为吗?我该如何免费发布编译警告? 以下是一些阅读乐趣: 1>c:\program files\microsoft visual studio 10.0\vc\include\stdint.h(105): warning C4668: '_INTPTR' is not defined as a preprocessor macro, replacing with '0' for '#if/#elif' 1>c:\program files\microsoft visual studio 10.0\vc\include\wchar.h(109): warning C4820: '_wfinddata64i32_t' : '4' bytes padding added after data member '_wfinddata64i32_t::attrib' 1>c:\program files\microsoft visual studio 10.0\vc\include\wchar.h(114): warning C4820: '_wfinddata64i32_t' : '4' …



4
1.#INF00,-1。#IND00和-1。#IND是什么意思?
我在弄乱一些使用浮点数的C代码,当我尝试在屏幕上打印浮点数时,得到1.#INF00,-1。#IND00和-1。#IND。这些值是什么意思? 我相信1.#INF00表示正无穷大,但是-1。#IND00和-1。#IND呢?有时我还会看到以下值:1. $ NaN不是数字,但是是什么原因导致这些奇怪的值,这些值如何帮助我进行调试? 我使用的是MinGW,我相信它将IEEE 754表示形式用于浮点数。 有人可以列出所有这些无效值及其含义吗?
67 c++  c 

8
C ++中的枚举类型数据的大小是多少?
这是一个C ++面试测试问题而不是作业。 #include <iostream> using namespace std; enum months_t { january, february, march, april, may, june, july, august, september, october, november, december} y2k; int main () { cout << "sizeof months_t is " << sizeof(months_t) << endl; cout << "sizeof y2k is " << sizeof(y2k) << endl; enum months_t1 { …
67 c++  enums  sizeof 

7
有什么方法可以使Visual Studio停止缩进名称空间?
Visual Studio一直尝试使名称空间内的代码缩进。 例如: namespace Foo { void Bar(); void Bar() { } } 现在,如果我手动取消缩进,那么它将保持这种状态。但是不幸的是,如果我在前面添加一些内容void Bar();(例如评论),VS将继续尝试使其缩进。 太烦人了,基本上因为这个唯一的原因,我几乎从不使用C ++中的名称空间。我不明白为什么它会尝试缩进它们(整个文件缩进1个甚至5个制表符的意义是什么?),或者如何使其停止。 有没有办法停止这种行为?配置选项,加载项,注册表设置,甚至直接修改devenv.exe的黑客。

7
将'typedef'从基础类传播到'模板'的派生类
我试图定义只包含typedef的基类。 template<typename T> class A { public: typedef std::vector<T> Vec_t; }; template<typename T> class B : public A<T> { private: Vec_t v; // fails - Vec_t is not recognized }; 为什么在BI中收到无法识别Vec_t的错误,我需要显式地编写它? typename A<T>::Vec_t v;

2
/ Ox和/ O2编译器选项之间有什么区别?
Microsoft的C ++编译器(cl.exe包括在Visual Studio中)提供了几个优化开关。它们中的大多数之间的差异似乎是不言而喻的,但是我不清楚/O2(将代码优化为最大速度)与/Ox(选择“完全优化”)之间的区别。 我试着阅读文档的/Ox选项,它似乎证实,该交换机还支持优化的最高速度,而不是大小: 所述/Ox编译器选项产生在较小尺寸有利于代码的执行速度。 但特别是,“备注”部分下的以下声明引起了我的注意: 通常,请指定/O2(Maximize Speed)而不是/Ox。 所以我的问题是,为什么要一个普遍青睐/O2了/Ox?后一个选项是否启用已知的特定优化,从而导致无法预料的错误或其他意外行为?仅仅是获得的优化数量不值得额外的编译时间吗?还是由于VS中/O2的默认选项而导致的这完全是毫无意义的“推荐” ?

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.