Questions tagged «c++»

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

4
为什么T *可以在寄存器中传递,但unique_ptr <T>无法传递?
我正在观看Chandler Carruth在CppCon 2019中的演讲: 没有零成本抽象 在该示例中,他举例说明了您对使用std::unique_ptr&lt;int&gt;over和会产生多少开销而感到惊讶int*。该段大约在时间点17:25开始。 您可以看一下他的示例代码对(godbolt.org)的编译结果 -可以看到,确实,编译器似乎不愿意传递unique_ptr值-实际上,底线是只是一个地址-在寄存器内,仅在直接内存中。 Carruth先生在27:00左右提出的观点之一是,C ++ ABI要求按值传递参数(某些但不是全部;也许-非基本类型?而不是在寄存器中。 我的问题: 这实际上是某些平台上的ABI要求吗?(哪个?)或者在某些情况下可能只是一些悲观? 为什么ABI这样?也就是说,如果结构/类的字段适合寄存器,甚至单个寄存器,为什么我们不能在该寄存器中传递它呢? 近年来,C ++标准委员会是否曾经讨论过这一点? PS-为了不给这个问题留下代码: 普通指针: void bar(int* ptr) noexcept; void baz(int* ptr) noexcept; void foo(int* ptr) noexcept { if (*ptr &gt; 42) { bar(ptr); *ptr = 42; } baz(ptr); } 唯一指针: using std::unique_ptr; void bar(int* ptr) noexcept; void …

6
C ++中的volatile与可变
我对volatile和mutable之间的区别有疑问。我注意到两者都意味着可以对其进行更改。还有什么?它们是一样的吗?有什么不同?它们在哪里适用?为什么提出这两个想法?如何以不同方式使用它们? 非常感谢。
85 c++  volatile  mutable 

3
C和C ++中几乎相同的代码在执行时间上的巨大差异(x9)
我正尝试通过www.spoj.com解决此问题:FCTRL-阶乘 您真的不必阅读它,如果您好奇的话就去做:) 首先,我用C ++实现了它(这是我的解决方案): #include &lt;iostream&gt; using namespace std; int main() { unsigned int num_of_inputs; unsigned int fact_num; unsigned int num_of_trailing_zeros; std::ios_base::sync_with_stdio(false); // turn off synchronization with the C library’s stdio buffers (from https://stackoverflow.com/a/22225421/5218277) cin &gt;&gt; num_of_inputs; while (num_of_inputs--) { cin &gt;&gt; fact_num; num_of_trailing_zeros = 0; for (unsigned int fives …
85 c++  c  performance  gcc  iostream 

3
A()= A()-为什么要编译?
class A {}; int main() { A() = A(); return 0; } 为什么要编译此代码?应该不会在赋值运算符的左侧放置左值吗?是A()左值吗?g ++ 4.7版本
85 c++ 

9
什么是最有效的线程安全C ++记录器?[关闭]
关闭。此问题不符合堆栈溢出准则。它当前不接受答案。 想改善这个问题吗?更新问题,使其成为Stack Overflow的主题。 6年前关闭。 改善这个问题 我正在研究性能至关重要的多线程应用程序。我查看了rlog,Ace和Boost日志记录。我选择rlog是因为我读到它是最快的(禁用日志记录后,其开销最少)。 我的问题是即使在发布模式下,它也会显示文件名,行号等。如果您可以告诉我如何关闭该信息,则可能会解决我的问题。在任何情况下,对于我来说,最有效的C ++记录器是什么?
85 c++  logging 

1
将Maven用于C / C ++项目
我将Maven构建为围绕业余,写得不好和坦率的集群-原始C / C ++代码(意味着一些C,一些C ++)。问题是-目前有很多流通产品,无法轻易更换。构建它需要很多部落知识(您必须从一个多维数据集到另一个多维数据集,才能了解如何编译/构建各个部分),而发布则是一个噩梦。(不-我不会重写它,请不要问。)我的问题是-我应该使用maven-native-plugin它替换大量简短的makefile还是exec-maven-plugin仅执行这些文件?到目前为止,我在后者做.NET方面有相当不错的经验,不知道我应该投资于native插件还是继续使用exec?如果您有使用“ Mavenizing” C / C ++的经验,我希望获得一些建议。

12
将地图值复制到STL中的矢量
目前,我正在通过有效的STL进行工作。第5项建议通常最好使用range成员函数而不是它们的单个元素对应项。我目前希望将地图中的所有值(即-我不需要键)复制到向量中。 什么是最干净的方法?
85 c++  stl  containers 


10
有什么理由在C ++ 03中使用'auto'关键字吗?
请注意,此问题最初于2009年发布,在批准C ++ 11之前和在auto彻底改变关键字的含义之前。提供的答案仅与C ++ 03的含义(auto即指定的存储类)有关,而不与C ++ 11的含义(auto即自动类型推断)有关。如果您正在寻找有关何时使用C ++ 11的建议auto,则该问题与该问题无关。 在最长的时间内,我认为没有理由static在C中使用该关键字,因为在块范围之外声明的变量是隐式全局的。然后,我发现将变量声明为static块作用域内将赋予它永久的持续时间,而在块作用域之外(在程序作用域内)声明该变量将为其赋予文件作用域(只能在该编译单元中访问)。 因此,这仅给我留下了一个我可能尚未完全理解的auto关键字:关键字。除了“局部变量”之外,它还有其他含义吗?不管您想在任何地方使用它,对您而言,隐式所做的任何事情吗?auto变量在程序范围内如何表现?static auto文件范围中的变量是什么?除了完整性之外,此关键字还有其他用途吗?
85 c++  keyword  c++03 

2
函数的内联版本与非内联版本返回的值不同
同一函数的两个版本如何不同,它们的不同之处仅在于一个是内联函数而另一个不是内联函数?这是我今天编写的一些代码,我不确定它如何工作。 #include &lt;cmath&gt; #include &lt;iostream&gt; bool is_cube(double r) { return floor(cbrt(r)) == cbrt(r); } bool inline is_cube_inline(double r) { return floor(cbrt(r)) == cbrt(r); } int main() { std::cout &lt;&lt; (floor(cbrt(27.0)) == cbrt(27.0)) &lt;&lt; std::endl; std::cout &lt;&lt; (is_cube(27.0)) &lt;&lt; std::endl; std::cout &lt;&lt; (is_cube_inline(27.0)) &lt;&lt; std::endl; } 我希望所有输出都等于1,但实际上输出了此值(g ++ 8.3.1,没有标志): 1 0 …
85 c++ 

3
包含未定义行为的源代码会使编译器崩溃合法吗?
假设我去编译一些编写不佳的C ++源代码,这些源代码会调用未定义的行为,因此(正如他们所说)“任何事情都可能发生”。 从C ++语言规范在“合格”编译器中认为可接受的角度来看,这种情况下的“任何情况”是否包括编译器崩溃(或窃取我的密码,或者在编译时出现异常或错误),或者未定义行为的范围专门限于生成的可执行文件运行时会发生什么?

4
有选择地仅对翻译单元的一部分禁用GCC警告吗?
与此MSVC预处理程序代码最接近的GCC是什么? #pragma warning( push ) // Save the current warning state. #pragma warning( disable : 4723 ) // C4723: potential divide by 0 // Code which would generate warning 4723. #pragma warning( pop ) // Restore warnings to previous state. 我们在通常包含的标头中有代码,我们不想生成特定的警告。但是,我们希望包含那些标题的文件继续生成该警告(如果项目启用了该警告)。

1
我可以使用Qt LGPL许可证并出售我的应用程序而没有任何限制吗?[关闭]
关闭。这个问题是题外话。它当前不接受答案。 想改善这个问题吗? 更新问题,使其成为Stack Overflow的主题。 8年前关闭。 改善这个问题 我想启动一个跨平台项目。我做了研究,现在我几乎可以肯定Qt是正确的选择。但是这里有一个很大的障碍:许可。 我想出售自己的项目,也不想透露任何与我的工作相关的资源或支付许可证费用。我检查并发现Qt提供商业和开源解决方案。我听过太多关于Qt许可的矛盾说法,这让我很困惑。有人说,即使我使用LGPL版本的Qt,我仍然需要提交我的代码。这是真的? 有人可以给我关于Qt许可证的简单说明,并告诉我是否可以不受任何限制地出售我的应用程序吗?有人会告诉我Qt在跨平台开发方面是否有其他等效形式吗?
85 c++  qt  licensing 

10
将指针转换为整数
我正在尝试将现有代码改编为64位计算机。主要问题在于,在一个函数中,以前的编码器使用void *参数,该参数在函数本身中转换为合适的类型。一个简短的例子: void function(MESSAGE_ID id, void* param) { if(id == FOO) { int real_param = (int)param; // ... } } 当然,在64位计算机上,我得到以下错误: error: cast from 'void*' to 'int' loses precision 我想更正此问题,以便它仍可在32位计算机上且尽可能干净地工作。任何的想法 ?
85 c++  gcc  casting  64-bit  32-bit 


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.