找到 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

3K+ 次查看

main 的返回值用于指示程序如何退出。如果程序执行正常,则使用 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

2K+ 次查看

没有一种优雅的方法可以迭代 C/C++ 字符串的单词。对于某些人来说,最易读的方法可以被称为最优雅的方法,而对于其他人来说,最有效的方法。我已经列出了两种可以用来实现此目的的方法。第一种方法是使用 stringstream 读取以空格分隔的单词。如果您提供正确的检查,这有点局限性,但可以很好地完成任务。示例 #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

2K+ 次查看

对象切片用于描述将派生类对象赋值给基类实例的情况。这会导致派生类对象的 method 和 member variables 丢失。这被称为信息被切掉。例如,class Foo { int a; }; class Bar : public Foo { int b; }; 由于 Bar 扩展了 Foo,它现在有两个 member variables,a 和 b。因此,如果您创建了一个 Bar 类型的变量 bar,然后创建... 阅读更多

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

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

2K+ 次查看

来自 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<< *address << endl; } 这将打印 3,但是... 阅读更多

为什么使用“using namespace std”被认为是不好的实践?

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

397 次查看

C++ 具有一个标准库,其中包含在构建应用程序(如容器、算法等)时使用的通用功能。如果这些库使用的名称公开,例如,如果它们在全局范围内定义了一个队列类,那么您将无法再次使用相同的名称而不会发生冲突。因此,他们创建了一个命名空间 std 来包含此更改。“using namespace”语句只是意味着在其存在的作用域中,无需在每个名称之前添加 std:: 前缀即可使用 std 命名空间下的所有内容。虽然这种做法对于示例代码是可以的,但引入... 阅读更多

广告