Translating Why const Doesn't Make C Code Faster.

This commit is contained in:
LazyWolf Lin 2019-08-27 13:32:05 +08:00
parent 49b4b1408a
commit d123a06338

View File

@ -39,14 +39,14 @@ void constByArg(const int *x)
} }
``` ```
调用 `printf()`CPU 会通过指针从 RAM 中取得 `*x` 的值。很显然,`constByArg()` 会稍微快一点,因为编译器知道 `*x` 是常量,因此不需要在调用 `constFunc()` 之后再次获取它的值。 Its just printing the same thing. Right? Lets see the assembly code generated by GCC with optimisations cranked up: 调用 `printf()`CPU 会通过指针从 RAM 中取得 `*x` 的值。很显然,`constByArg()` 会稍微快一点,因为编译器知道 `*x` 是常量,因此不需要在调用 `constFunc()` 之后再次获取它的值。它仅是打印相同的东西。对吧?让我们来看下 GCC 在如下编译选项下生成的汇编代码:
``` ```
$ gcc -S -Wall -O3 test.c $ gcc -S -Wall -O3 test.c
$ view test.s $ view test.s
``` ```
Heres the full assembly output for `byArg()`: 以下是函数 `byArg()` 的完整汇编代码:
``` ```
byArg: byArg:
@ -73,7 +73,7 @@ byArg:
.cfi_endproc .cfi_endproc
``` ```
The only difference between the generated assembly code for `byArg()` and `constByArg()` is that `constByArg()` has a `call constFunc@PLT`, just like the source code asked. The `const` itself has literally made zero difference. 函数 `byArg()` 和函数 `constByArg()` 生成的汇编代码中唯一的不同之处是 `constByArg()` 有一句汇编代码 `call constFunc@PLT`,这正是源码中的调用。关键字 `const` 本身并没有造成任何汇编代码上的不同。
Okay, thats GCC. Maybe we just need a sufficiently smart compiler. Is Clang any better? Okay, thats GCC. Maybe we just need a sufficiently smart compiler. Is Clang any better?