为编程找到 34423 篇 文章

为什么处理 C++ 中的已排序数组比处理未排序数组快?

Anvi Jain
2020 年 6 月 23 日 13:43:58 更新

221 次浏览

在 C++ 中,处理已排序数组比处理未排序数组快,这是因为有分支预测。在计算机架构中,分支预测确定程序指令流中的条件分支(跳转)是否可能被采用。我们举个例子 −if(arr[i] > 50) {    执行某些操作 B } else {    执行某些操作 A }如果针对未排序和已排序顺序中的 100 个元素运行此代码,将会发生以下情况 −对于已排序数组 −1、2、3、4、5、……50、51……100 A、A、A、A、A A、B ... 阅读更多内容

C 和 C++ 中未定义、未指定和实现定义的行为之间的区别?

Abhinanda Shri
2019 年 7 月 30 日 22:30:21 更新

336 次浏览

未定义的行为是指 C++ 规范并未定义的行为。例如,如果你在表达式中有多个一元递增/递减运算(如 i++ + ++i),它们将导致的行为未定义。这仅仅是因为一些语言结构在语法上有效,但你无法预测代码运行时会出现什么行为。另一个示例是表达式:u = (u++);实施定义的行为是规范未指定且留给实现者决定并记录如何做出选择的行为。在这种情况下,做出的选择必须...阅读更多

main() 在 C 和 C++ 中应该返回什么?

Nitya Raut
更新于 2020 年 2 月 11 日 10:29:31

3 千次浏览

main 的返回值用于指示程序如何退出。如果程序执行正常,则使用 0 作为返回值。异常终止(错误、无效输入、分段错误等)通常由非 0 返回值终止。对于如何解释非 0 代码,没有标准。不过,你可以定义自己的状态代码并在程序中使用它们来表示不同类型的故障。GCC 建议在 stdlib.h 中使用 EXIT_SUCCESS 或 EXIT_FAILURE 来发送退出信号。在 C++ 中,int main() 可以不带返回值,此时它会默认返回 0。阅读更多

C++ 中的复制和交换惯用语是什么?

Ankith Reddy
更新于 2020 年 6 月 23 日 13:51:21

213 次浏览

赋值包含两个步骤,撕掉对象的旧状态以及为其构建一个新状态。析构函数用于第一个步骤,而复制构造函数负责第二个步骤。实现这两方面都很简单。但在重载赋值运算符时,实现可能变得相当困难。复制和交换惯用语则是相同问题的解决方案。此惯用语使用复制构造函数来构建数据的本地副本。然后使用 swap 函数将旧数据与新数据交换。然后临时副本使用析构函数进行析构。我们... 阅读更多

如何在 Linux 中分析运行的 C++ 代码?

Vrundesha Joshi
更新于 2020 年 2 月 11 日 10:28:25

881 次浏览

针对在 Linux 中分析 C++ 程序,有很多出色的分析工具。使用最广泛的工具是 Valgrind。这是一款用于内存调试、内存泄漏检测和分析的编程工具。你可以通过将二进制文件传递给它并将工具设置为 callgrind 来使用 valgrind。首先,通过编译程序来生成二进制文件- $ g++ -o hello.cpp hello 现在使用 valgrind 对其进行分析:$ valgrind --tool=callgrind ./hello 这将生成名为 callgrind.out.x 的文件。你可以使用名为 kcachegrind 的工具来读取此文件。如果你使用 gcc,则可以用 gprof 使用内置分析工具。你可以...阅读更多

遍历 C/C++ 字符串单词的最优雅方式

Arjun Thakur
更新于 2020 年 2 月 11 日 10:27:10

2 千次浏览

没有一种优雅的方式来迭代 C/C++ 字符串中的单词。最具可读性的一种方式对一些人来说可能是最优雅的一种方式,但对另一些人来说可能是性能最好的方式。我列出了 2 种可用来实现此目的的方法。第一种方式是使用字符串流来读取以空格分隔的单词。这种方式功能略微受限,但如果你提供了适当的检查,则也能很好地完成这项任务。示例#include #include #include using namespace std; int main() {     string str("Hello from the dark side");     string tmp;         ... 阅读更多

C++ 或 Java 中的对象切片是什么?

Ankitha Reddy
2019 年 7 月 30 日 22:30:21 更新

2 千次浏览

对象切片用于描述将派生类对象分配给基类实例的情况。这会导致派生类对象的成员变量和方法丢失。这被称为信息被切片剥离。例如,类 Foo { int a; }; 类 Bar : public Foo { int b; }; 由于 Bar 扩展了 Foo,因此它现在具有 2 个成员变量,即 a 和 b。因此,如果你创建了类型为 Bar 的变量 bar,然后创建 ... 阅读更多

在 C++ 标识符中使用下划线的规则是什么?

Arjun Thakur
更新于 2020 年 2 月 11 日 10:22:52

2 千次浏览

来自 MSDN 文档−在标识符开头使用两个连续的下划线字符 ( __ ),或使用一个前导下划线后跟一个大写字母,在所有作用域中都会保留给 C++ 实现。你应该避免对文件作用域的名称使用一个前导下划线后跟一个字母,因为可能与当前或未来的保留标识符产生冲突。因此,你应该避免使用如下名称:−__foo、__FOO、_FOO,且如下名称不应用于全局名称空间:−_foo、_bar除此之外,还有一些其他前缀,如 LC_、SIG_,以及后缀,如 _t ... 阅读更多

可以在 C/C++ 中在其作用域之外访问局部变量的内存吗?

Rishi Rathor
更新于 2020 年 2 月 11 日 10:20:27

146 个浏览量

让我们看一个例子,在这个例子中你也许能够在其作用域之外访问局部变量的内存。示例#include int* foo() {    int x = 3;    return &x; } int main() {    int* address = foo();    cout

为什么使用“using namespace std' 被认为是不良实践?

Abhinaya
2019 年 7 月 30 日 22:30:21 更新

397 个浏览量

C++ 具有一个标准库,其中包含你在构建应用程序时会用到的常见功能,如容器、算法等。如果这些所用的名称在公开状态下,例如,如果它们在全局方式下定义队列类,你将无法在不产生冲突的情况下再次使用同一名称。因此,他们创建了一个名称空间 std 来包含此更改。using namespace 语句仅表示它存在的范围中使 std 名称空间中的所有内容可用,而无需在每个内容前面加上 std:: 前缀。虽然这种做法对于示例代码来说是可以的,但引入 ... 阅读更多

广告