Questions tagged «c++»

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

5
什么会“ std :;” 用C ++做?
我最近正在修改一些代码,并在函数中的一行上发现了一个预先存在的错误: std:;string x = y; 该代码仍然可以编译,并且按预期工作。 字符串定义有效,因为此文件是using namespace std;,因此std::首先不需要。 问题是,为什么要std:;编译?它在做什么(如果有的话)?
89 c++  std  colon 

2
为什么将字符“ A”与0x41进行比较?
我正在查看一些C ++代码,发现以下结构: if('A' == 0x41) { // ... } else if('A' == 0xc1) { // ... } else { // ... } 我收到Visual Studio警告,说: 警告C4127条件表达式恒定。 Visual Studio显然是正确的-肯定将“ A”定义为0x41。鉴于三个分支中有两个是无效代码,为什么作者要编写此代码?
89 c++  string 

2
GNU GCC(g ++):为什么会生成多个dtor?
开发环境:GNU GCC(g ++)4.1.2 当我试图研究如何在单元测试中增加“代码覆盖率-特别是功能覆盖率”时,我发现某些类dtor似乎会多次生成。你们当中有人对为什么有任何想法吗? 我尝试并使用以下代码观察了上面提到的内容。 在“ test.h”中 class BaseClass { public: ~BaseClass(); void someMethod(); }; class DerivedClass : public BaseClass { public: virtual ~DerivedClass(); virtual void someMethod(); }; 在“ test.cpp”中 #include <iostream> #include "test.h" BaseClass::~BaseClass() { std::cout << "BaseClass dtor invoked" << std::endl; } void BaseClass::someMethod() { std::cout << "Base …
89 c++  g++  destructor 

4
为什么没有默认的移动分配/移动构造函数?
我是一个简单的程序员。我的班级成员变量通常由POD类型和STL容器组成。因此,我很少需要编写赋值运算符或复制构造函数,因为它们是默认实现的。 此外,如果我std::move在不可移动的对象上使用它,则使用赋值运算符,这std::move是绝对安全的。 因为我是一个简单的程序员,所以我想利用移动功能,而不必在我编写的每个类中添加移动构造函数/赋值运算符,因为编译器可以将它们简单地实现为“ this->member1_ = std::move(other.member1_);...” 但这不是(至少在Visual 2010中不是),是否有任何特殊原因? 更重要的是; 有什么办法可以解决这个问题? 更新: 如果您不看GManNickG的答案,他为此提供了一个很好的宏。如果您不知道,如果您实现了移动语义,则可以删除掉swap成员函数。

4
为什么memmove比memcpy快?
我正在研究某个应用程序中的性能热点,该应用程序将其50%的时间都花在memmove(3)上。该应用程序将数百万个4字节的整数插入已排序的数组中,并使用memmove将数据“右移”,以便为插入的值腾出空间。 我的期望是复制内存的速度非常快,而令我惊讶的是花了这么多时间在记忆体上。但是后来我想到memmove速度很慢,因为它移动的是重叠区域,必须在一个紧密的循环中实现它,而不是复制大内存页。我写了一个小型的微基准测试,以找出memcpy和memmove之间的性能差异,期望memcpy能够胜任。 我在两台机器(核心i5,核心i7)上运行了基准测试,发现memmove实际上比memcpy快,在较旧的i7核心上甚至快两倍。现在,我正在寻找解释。 这是我的基准。它使用memcpy复制100 mb,然后使用memmove复制大约100 mb;源和目标重叠。尝试了源和目的地的各种“距离”。每次测试运行10次,平均时间被打印出来。 https://gist.github.com/cruppstahl/78a57cdf937bca3d062c 以下是Core i5(Linux 3.5.0-54-通用#81〜precise1-Ubuntu SMP x86_64 GNU / Linux)上的结果,gcc为4.6.3(Ubuntu / Linaro 4.6.3-1ubuntu5)。括号中的数字为源与目标之间的距离(间隙大小): memcpy 0.0140074 memmove (002) 0.0106168 memmove (004) 0.01065 memmove (008) 0.0107917 memmove (016) 0.0107319 memmove (032) 0.0106724 memmove (064) 0.0106821 memmove (128) 0.0110633 Memmove被实现为SSE优化的汇编代码,从后到前复制。它使用硬件预取将数据加载到缓存中,然后将128个字节复制到XMM寄存器中,然后将其存储在目标位置。 (memcpy-ssse3-back.S,行1650 ff) L(gobble_ll_loop): prefetchnta -0x1c0(%rsi) prefetchnta -0x280(%rsi) prefetchnta …
89 c++  c  performance  memory 

3
这是C ++ 11 for循环的已知陷阱吗?
让我们想象一下,我们有一个结构可以容纳带有某些成员函数的3个double: struct Vector { double x, y, z; // ... Vector &negate() { x = -x; y = -y; z = -z; return *this; } Vector &normalize() { double s = 1./sqrt(x*x+y*y+z*z); x *= s; y *= s; z *= s; return *this; } // ... }; 为了简化起见,这有点人为设计,但是我敢肯定您同意类似的代码已经存在。这些方法使您可以方便地进行链接,例如: Vector v …

8
我应该使用哪个STL容器作为FIFO?
哪个STL容器最适合我的需求?我基本上有一个10个元素宽的容器,在其中我会不断添加push_back新元素,同时pop_front选择最旧的元素(大约一百万次)。 我目前正在使用a std::deque来执行任务,但想知道a std::list是否会更高效,因为我不需要重新分配自身(或者我误以为a std::deque了std::vector)。还是有一个我需要的效率更高的容器? PS我不需要随机访问
89 c++  stl  fifo 

12
如何在C ++中声明字符串数组?
我正在尝试以最佳方式遍历静态字符串数组的所有元素。我希望能够在一行上声明它,并轻松地从中添加/删除元素,而不必跟踪数字。听起来真的很简单,不是吗? 可能的非解决方案: vector<string> v; v.push_back("abc"); b.push_back("xyz"); for(int i = 0; i < v.size(); i++) cout << v[i] << endl; 问题-无法在带有字符串列表的一行上创建矢量 可能的非解决方案2: string list[] = {"abc", "xyz"}; 问题-无法自动获取字符串数量(据我所知)。 必须有一个简单的方法来执行此操作。
89 c++  arrays 

7
如何从单独的字符串(安全)构建完整路径字符串?
C ++是否与python的功能等效os.path.join?基本上,我正在寻找将文件路径的两个(或多个)部分组合在一起的东西,这样您就不必担心确保两个部分完美地结合在一起。如果在Qt中,那也很酷。 基本上,我花了一个小时来调试一些代码,其中至少有一部分是因为root + filename必须这样做root/ + filename,因此我希望将来避免这种情况。
89 c++  qt  filepath 

9
stdcall和cdecl
(除其他外)有两种调用约定-stdcall和cdecl。我对他们有几个问题: 调用cdecl函数时,调用者如何知道是否应释放堆栈?在呼叫站点,呼叫者是否知道被调用的函数是cdecl还是stdcall函数?它是如何工作的 ?调用方如何知道是否应该释放堆栈?还是链接器的责任? 如果一个声明为stdcall的函数调用一个函数(其调用约定为cdecl),或者相反,这是否不合适? 通常,我们可以说哪个调用会更快-cdecl或stdcall吗?
89 c++  stdcall  cdecl 

3
“假设”规则到底是什么?
如标题所示, “假设”规则到底是什么? 一个典型的答案是: 允许任何和所有代码转换而不会改变程序可观察行为的规则 我们会不时地从某些实现中获得归因于该规则的行为。很多次是错误的。所以,这条规则到底是什么。该标准没有明确提及该规则的一部分或段落,那么该规则的作用范围到底是什么?对我来说,这似乎是一个灰色区域,该标准未对其进行详细定义。有人可以引用标准的参考文献来详细说明细节吗? 注意:将此标记为C和C ++,因为它与两种语言都相关。
89 c++  c  optimization  c++-faq  as-if 



7
函数级静态变量何时分配/初始化?
我非常有信心在程序启动时分配(并初始化,如果适用)全局声明的变量。 int globalgarbage; unsigned int anumber = 42; 但是函数中定义的静态变量呢? void doSomething() { static bool globalish = true; // ... } 什么时候globalish分配空间?我猜该程序何时启动。但是它也会被初始化吗?还是在doSomething()第一次调用时初始化?
89 c++  variables 


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.