Questions tagged «c++»

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

11
现代硬件上的浮点数与整数计算
我正在用C ++进行一些性能至关重要的工作,并且我们目前正在使用整数计算来解决那些固有的浮点问题,因为它“更快”。这会引起很多烦人的问题,并增加了很多烦人的代码。 现在,我记得读过有关浮点计算如何如此缓慢的信息,大约在386天左右,我相信(IIRC)有一个可选的协同处理器。但是,如今在使用指数级更复杂,功能更强大的CPU时,如果进行浮点或整数计算,那么“速度”没有区别吗?特别是由于与导致流水线停滞或从主内存中获取某些内容相比,实际的计算时间很小? 我知道正确的答案是在目标硬件上进行基准测试,什么是测试此硬件的好方法?我编写了两个微型C ++程序,并将它们的运行时间与Linux上的“时间”进行了比较,但是实际的运行时间变化太大(对我在虚拟服务器上运行没有帮助)。我一整天都没有运行数百个基准测试,制作图表等,我是否可以做一些事情来对相对速度进行合理测试?有什么想法或想法吗?我完全错了吗? 我使用的程序如下,它们在任何方面都不相同: #include <iostream> #include <cmath> #include <cstdlib> #include <time.h> int main( int argc, char** argv ) { int accum = 0; srand( time( NULL ) ); for( unsigned int i = 0; i < 100000000; ++i ) { accum += rand( ) % 365; } …

9
安全地覆盖C ++虚拟函数
我有一个带有虚函数的基类,并且我想在派生类中重写该函数。有什么方法可以使编译器检查我在派生类中声明的函数是否实际上覆盖了基类中的函数?我想添加一些宏或一些确保我不会意外声明新函数的东西,而不是覆盖旧函数。 举个例子: class parent { public: virtual void handle_event(int something) const { // boring default code } }; class child : public parent { public: virtual void handle_event(int something) { // new exciting code } }; int main() { parent *p = new child(); p->handle_event(1); } 这里parent::handle_event()称为而不是child::handle_event(),因为子方法遗漏了const声明,因此声明了一个新方法。这也可能是函数名称的错字或参数类型的细微差别。如果基类的接口发生更改,并且某些派生类未进行更新以反映更改,则也很容易发生这种情况。 有什么方法可以避免此问题,我可以以某种方式告诉编译器或其他工具为我检查吗?任何有用的编译器标志(最好是g ++)?您如何避免这些问题?

7
什么是std :: string :: c_str()寿命?
在我的一个程序中,我必须与可以使用的一些旧代码交互const char*。 可以说我有一个看起来像的结构: struct Foo { const char* server; const char* name; }; 我的上层应用程序仅处理std::string,因此我想到了使用std::string::c_str()来获取const char*指针。 但是,寿命是c_str()多少? 我可以做这样的事情而不会遇到不确定的行为吗? { std::string server = "my_server"; std::string name = "my_name"; Foo foo; foo.server = server.c_str(); foo.name = name.c_str(); // We use foo use_foo(foo); // Foo is about to be destroyed, before name and server …
100 c++  string  cstring 

3
gcc std :: unordered_map实现慢吗?如果是这样-为什么?
我们正在用C ++开发高性能的关键软件。在那里,我们需要一个并发的哈希映射并实现一个。因此,我们编写了一个基准来确定与并发哈希图相比要慢多少std::unordered_map。 但是,这std::unordered_map似乎太慢了……所以这是我们的微基准测试(对于并发映射,我们产生了一个新线程,以确保不会对锁定进行优化,并且请注意,我从不插入0,因为我也使用进行了基准测试google::dense_hash_map,需要一个空值): boost::random::mt19937 rng; boost::random::uniform_int_distribution<> dist(std::numeric_limits<uint64_t>::min(), std::numeric_limits<uint64_t>::max()); std::vector<uint64_t> vec(SIZE); for (int i = 0; i < SIZE; ++i) { uint64_t val = 0; while (val == 0) { val = dist(rng); } vec[i] = val; } std::unordered_map<int, long double> map; auto begin = std::chrono::high_resolution_clock::now(); for (int i = 0; …

2
std :: result_of和decltype之间的区别
我在理解std::result_ofC ++ 0x 的需求时遇到了一些麻烦。如果我理解正确,result_of它用于获得使用某些类型的参数调用函数对象的结果类型。例如: template <typename F, typename Arg> typename std::result_of<F(Arg)>::type invoke(F f, Arg a) { return f(a); } 我看不出以下代码有什么区别: template <typename F, typename Arg> auto invoke(F f, Arg a) -> decltype(f(a)) //uses the f parameter { return f(a); } 要么 template <typename F, typename Arg> auto invoke(F f, Arg …
100 c++  c++11  decltype  result-of 

8
如何在C ++中连接两个字符串?
我有一个私有类变量char name[10],我想在其中添加.txt扩展名,以便可以打开目录中存在的文件。 我该怎么办? 最好创建一个新的字符串变量来保存串联的字符串。
100 c++ 

11
编译时间字符串哈希
我在几个不同的地方读到,使用C ++ 11的新字符串文字可能在编译时计算字符串的哈希值。但是,似乎没有人愿意提出来,说这将是可能的或如何实现的。 这可能吗? 操作员会是什么样子? 我对这样的用例特别感兴趣。 void foo( const std::string& value ) { switch( std::hash(value) ) { case "one"_hash: one(); break; case "two"_hash: two(); break; /*many more cases*/ default: other(); break; } } 注意:编译时哈希函数不必看起来像我写的那样。我尽力猜测最终的解决方案是什么样的,但meta_hash<"string"_meta>::value也可能是可行的解决方案。


10
Java和C / C ++之间最快的(低延迟)进程间通信方法
我有一个Java应用程序,通过TCP套接字连接到用C / C ++开发的“服务器”。 应用程序和服务器都在同一台计算机上运行,​​这是一个Solaris机器(但我们最终正在考虑迁移到Linux)。交换的数据类型是简单的消息(登录,登录ACK,然后客户端要求某些内容,服务器答复)。每个消息大约300字节长。 当前,我们正在使用套接字,并且一切都很好,但是我正在寻找使用IPC方法交换数据(更快的延迟)的更快方法。 我一直在研究网络,并提出了以下技术的参考: 共享内存 管道 s列 以及所谓的DMA(直接内存访问) 但是我找不到对它们各自性能的正确分析,也找不到如何在JAVA和C / C ++中实现它们(以便它们可以相互通信)的方法,但也许我可以想象如何做。 在这种情况下,任何人都可以评论每种方法的性能和可行性吗?任何指向有用的实现信息的指针/链接? 编辑/更新 在我到达这里的评论和答案之后,我找到了有关Unix Domain Sockets的信息,该信息似乎是通过管道构建的,将为我节省整个TCP堆栈。它是特定于平台的,因此我计划使用JNI或juds或junixsocket对其进行测试。 下一个可能的步骤是直接实现管道,然后实现共享内存,尽管我已经被警告过额外的复杂性... 谢谢你的帮助
100 java  c++  performance  ipc  latency 

4
竞技场一词与记忆有关的含义是什么?
我正在读一本关于内存的编程概念书。在后面的章节中,作者大量使用了arena一词,但从未定义。我搜索了单词的含义以及它与记忆的关系,但没有发现任何问题。以下是作者使用该术语的几种情况: “序列化的下一个示例包含了一种从特定场所进行的称为内存分配的策略。” “ ...在处理内存泄漏或从特定场所进行分配时,这很有用。” “ ...如果我们想重新分配内存,那么我们将重新分配整个竞技场。” 作者在一章中使用了100次以上的术语。词汇表中的唯一定义是: 从竞技场分配 -先分配竞技场,然后由程序本身(而不是由进程内存管理器)管理竞技场内的分配/取消分配的技术;用于复杂数据结构和对象的压缩和序列化,或用于安全关键和/或容错系统中的内存管理。 在这些情况下,谁能为我定义竞技场?

7
C ++中“ using”声明的范围是什么?
我在C ++中使用'using'声明将std :: string和std :: vector添加到本地名称空间(以节省键入不必要的'std ::'s)。 using std::string; using std::vector; class Foo { /*...*/ }; 该声明的范围是什么?如果我在标头中执行此操作,是否会将这些“使用”声明注入每个包含标头的cpp文件中?
100 c++ 

5
如何将浮点数初始化为其最大值/最小值?
如何对浮点数或双精度数的绝对最大值或最小值进行硬编码?我想通过简单地遍历并捕获最大的数组来搜索数组的最大值/最小值。 浮点数也有正负无穷大,我应该改用它们吗?如果是这样,我该如何在代码中表示呢?

8
如何在C ++中为函数名称分配别名?
为类型,变量或名称空间创建新名称很容易。但是,如何为函数分配新名称?例如,我想使用的名称holler进行printf。#define很明显...还有其他方法吗? 解决方案: #define holler printf void (*p)() = fn; //function pointer void (&r)() = fn; //function reference inline void g(){ f(); }
100 c++  alias 

4
C ++ const映射元素访问
我尝试使用operator []访问const C ++映射中的元素,但是此方法失败。我也尝试使用“ at()”来做同样的事情。这次成功了。但是,我找不到有关使用“ at()”访问const C ++映射中的元素的任何参考。“ at()”是C ++映射中的新增功能吗?在哪里可以找到更多有关此的信息?非常感谢你! 示例如下: #include <iostream> #include <map> using namespace std; int main() { map<int, char> A; A[1] = 'b'; A[3] = 'c'; const map<int, char> B = A; cout << B.at(3) << endl; // it works cout << B[3] << endl; // …
100 c++  stl  map  const 


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.