Questions tagged «c++»

有关C ++的问题,C ++是一种静态类型,自由格式,多范式,已编译的通用编程语言。

7
为什么要在一行中声明一个变量,然后在下一行中对其赋值?
我经常在C和C ++代码中看到以下约定: some_type val; val = something; some_type *ptr = NULL; ptr = &something_else; 代替 some_type val = something; some_type *ptr = &something_else; 最初,我认为这是从必须在范围的顶部声明所有局部变量的日子起遗留下来的习惯。但是我学会了不要这么快就消除资深开发人员的习惯。因此,是否有充分的理由在一行中声明并在事后分配?
101 c++  c 

14
编写依赖于编译器优化的代码是不好的做法吗?
我一直在学习一些C ++,并且经常不得不从该函数内创建的函数中返回大型对象。我知道有按引用传递,返回指针和返回引用类型的解决方案,但我还读到C ++编译器(和C ++标准)允许返回值优化,从而避免了通过内存复制这些大对象,从而节省所有时间和内存。 现在,当以值显式返回对象时,我感到语法更加清晰,并且编译器通常将使用RVO并使过程更高效。依靠这种优化是不好的做法吗?这对于用户来说使代码更清晰,更易读,这是非常重要的,但是我应该谨慎地假设编译器会抓住RVO的机会吗? 这是微优化,还是在设计代码时应牢记的一点?
99 c++  performance 



8
在头文件或源文件中记录函数是否更好?
在区分“源”文件和“头文件”(主要是C和C ++)的语言中,最好在头文件中记录函数: (从CCAN窃取) /** * time_now - return the current time * * Example: * printf("Now is %lu seconds since epoch\n", (long)time_now().tv_sec); */ struct timeval time_now(void); 或在源文件中? (从PostgreSQL窃取) /* * Convert a UTF-8 character to a Unicode code point. * This is a one-character version of pg_utf2wchar_with_len. * * No …
86 c++  c  headers 

11
Java开发人员是否有意识地放弃了RAII?
作为一个长期的C#程序员,我最近来了解有关资源获取即初始化(RAII)的优点的更多信息。特别是,我发现了C#习惯用法: using (var dbConn = new DbConnection(connStr)) { // do stuff with dbConn } 具有C ++等效项: { DbConnection dbConn(connStr); // do stuff with dbConn } 这意味着记住以包围资源的使用像DbConnection在一个using块是在C ++不必要!这似乎是C ++的一大优势。当您考虑一个类的实例成员类型为时,这甚至更令人信服DbConnection。 class Foo { DbConnection dbConn; // ... } 在C#中,我需要IDisposable像这样实现Foo : class Foo : IDisposable { DbConnection dbConn; public void Dispose() { dbConn.Dispose(); …
82 java  c#  c++  language-design 

15
为什么Java可能比C ++更快?
在基准测试中,Java有时会胜过C ++。当然,有时C ++的表现会更好。 请参阅以下链接: http://keithlea.com/javabench/ http://blog.dhananjaynene.com/2008/07/performance-comparison-c-java-python-ruby-jython-jruby-groovy/ http://blog.cfelde.com/2010/06/c-vs-java-performance/ 但这怎么可能呢?令我惊讶的是,解释的字节码可能比编译的语言还要快。 有人可以解释一下吗?谢谢!
79 java  c++  performance 

5
为什么没有针对C和C ++的程序包管理系统?[关闭]
软件包管理系统存在一些编程语言: TeX的CTAN Perl的CPAN Python的点子和鸡蛋 Java Maven 阴谋的哈斯克尔 红宝石宝石 NPM对的NodeJS 前端Javascript和CSS的Bower nuget for C# PHP 作曲家 这样的系统还有其他语言吗?C和C ++呢?(这是主要问题!)为什么没有适用于他们的系统?而不是创建包yum,apt-get或其他一般的包管理系统更好?
78 c++  c  builds  packages 

20
可以用可读代码替换优化代码吗?
有时,您会遇到必须扩展/改进某些现有代码的情况。您会看到旧代码非常精简,但是它也很难扩展,而且花时间阅读。 用现代代码代替它是一个好主意吗? 一段时间以前,我喜欢精益方法,但现在看来,最好牺牲很多优化,而采用更高的抽象,更好的接口和更易读,可扩展的代码。 编译器似乎也越来越好,因此诸如之类struct abc = {}的东西被悄无声息地变成了memsets,shared_ptrs产生的代码几乎与原始指针扭曲相同,模板工作得很好,因为它们产生了超精简代码,依此类推。 但是,有时您仍然会看到基于堆栈的数组和带有一些晦涩逻辑的旧C函数,通常它们不在关键路径上。 如果您必须以某种方式触摸其中的一小部分代码,那么更改这种代码是一个好主意吗?

12
面向对象编程比过程编程有什么好处?
我试图了解过程语言(例如C)和面向对象的语言(例如C ++)之间的区别。我从未使用过C ++,但我一直在和朋友们讨论如何区分两者。 有人告诉我C ++具有面向对象的概念以及定义变量的公共模式和私有模式:C语言没有。在Visual Basic.NET中开发程序时,我从来不需要使用它们:这些有什么好处? 我还被告知,如果变量是公共变量,则可以在任何地方访问它,但是尚不清楚它与C之类的语言中的全局变量有何不同。还不清楚私有变量与局部变量有何不同。 我听到的另一件事是,出于安全原因,如果需要访问某个函数,则应首先继承该函数。用例是管理员应该只拥有所需的权限,而不是所有的权限,但是似乎有条件的也可以工作: if ( login == "admin") { // invoke the function } 为什么这不理想? 鉴于似乎有一种方法性的方法可以完成所有面向对象的编程,所以我为什么要关心面向对象的编程?


3
为什么Python用C而不是C ++编写?
在Python的教程中,可以看到Python的原始实现是在C中实现的; 另一方面,用C编写的Python实现(...) 我很好奇为什么Python是用C而不是C ++编写的? 我想知道此决定的原因,答案应以历史参考为依据(而非基于观点)。

6
是catch(…){抛出;}`不好的做法?
虽然我同意... 不进行重新捕获确实是错误的,但是我相信使用这样的结构: try { // Stuff } catch (...) { // Some cleanup throw; } 在RAII不适用的情况下是可以接受的。(请不要问……不是我公司的每个人都喜欢面向对象的程序设计,RAII通常被视为“无用的学习工具”……) 我的同事说,您应该始终知道要抛出哪些异常,并且始终可以使用类似以下的构造: try { // Stuff } catch (exception_type1&) { // Some cleanup throw; } catch (exception_type2&) { // Some cleanup throw; } catch (exception_type3&) { // Some cleanup throw; } 在这些情况下是否存在公认的良好实践?
74 c++ 

19
我为什么要关心微观性能和效率?
C / C ++页面上的许多问题和答案,特别是或间接地讨论了微性能问题(例如,间接函数,直接函数与内联函数的开销),或者使用O(N 2)vs O(N log N)算法100个项目列表。 除非或直到我知道我有问题,否则我始终不关心微性能,也不关心宏性能,而是专注于易于维护的可靠代码。 我的问题是,为什么很多程序员这么在乎呢?对于大多数开发人员来说,这真的是一个问题吗?我是否只是幸运地不必为此担心太多,还是我是一个糟糕的程序员?

3
为什么在新代码中几乎不使用C ++ 17的[[nodiscard]]是什么原因?
C ++ 17引入了该[[nodiscard]]属性,该属性允许程序员以一种方式标记函数,如果返回的对象被调用者丢弃,则编译器将生成警告。可以将相同的属性添加到整个类类型。 我已经在最初的提案中了解了使用此功能的动机,并且我知道C ++ 20会将属性添加到类似的标准函数中std::vector::empty,其名称并未传达关于返回值的明确含义。 这是一个很酷的实用功能。实际上,这似乎太有用了。在我所读过的所有地方[[nodiscard]],人们都在讨论它,就好像您只是将其添加到少数几个函数或类型中而忽略了其余的函数或类型一样。但是,为什么不可丢弃的值应该是特例,尤其是在编写新代码时?丢弃的返回值通常不是bug还是至少浪费资源? C ++本身的设计原则之一不是编译器应该捕获尽可能多的错误吗? 如果是这样,那么为什么不将[[nodiscard]]您自己的非传统代码添加到几乎每个单个非void函数和几乎每个单个类类型中呢? 我已经尝试过用自己的代码来做到这一点,并且它工作得很好,除了它非常冗长,以至于开始看起来像Java。使编译器默认警告丢弃的返回值 似乎更自然,除非您标记意图[*]的其他少数情况。 在标准提案,博客条目,Stack Overflow问题或互联网上的其他任何地方,我对这种可能性的讨论都为零,我一定会错过一些东西。 为什么这样的机制在新的C ++代码中没有意义?冗长是不是[[nodiscard]]几乎无处不在的唯一理由吗? [*]从理论上讲,您可能拥有类似[[maydiscard]]属性的内容,也可以将其追溯地添加到printf标准库实现中的功能中。
70 c++ 

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.