https://godbolt.org/g/5nDqoC
#include <cstdlib>
extern int a;
extern int b;
int main()
{
{
int tab[1];
tab[0] = 42;
a = tab[0];
}
{
int tab[1];
tab[0] = 42;
b = tab[0];
}
return 0;
}
使用带有 -O3 编译标志的 gcc 7 编译:
main:
mov DWORD PTR a[rip], 42
mov DWORD PTR b[rip], 42
xor eax, eax
ret
如果您点击链接,您应该会看到在 gcc 和 clang 上编译的代码具有 -O3 优化级别。生成的 asm 代码非常简单。由于存储在数组中的值在编译时是已知的,因此编译器可以轻松跳过所有内容并直接设置变量 a 和 b。不需要您的缓冲区。
遵循类似于您的示例中提供的代码:
https://godbolt.org/g/bZHSE4
#include <cstdlib>
int func1(const int (&tab)[10]);
int func2(const int (&tab)[10]);
int main()
{
int a[10];
int b[10];
func1(a);
func2(b);
return 0;
}
使用带有 -O3 编译标志的 gcc 7 编译:
main:
sub rsp, 104
mov rdi, rsp ; first address is rsp
call func1(int const (&) [10])
lea rdi, [rsp+48] ; second address is [rsp+48]
call func2(int const (&) [10])
xor eax, eax
add rsp, 104
ret
您可以看到发送给函数func1和func2的指针是不同的,因为在调用func1时使用的第一个指针是rsp,而[rsp+48]在对 func2 的调用中。
您可以看到,在可预测的情况下,编译器会完全忽略您的代码。在另一种情况下,至少对于 gcc 7 和 clang 3.9.1,它没有优化。
https://godbolt.org/g/TnV62V
#include <cstdlib>
extern int * a;
extern int * b;
inline int do_stuff(int ** to)
{
*to = (int *) malloc(sizeof(int));
(**to) = 42;
return **to;
}
int main()
{
do_stuff(&a);
free(a);
do_stuff(&b);
free(b);
return 0;
}
使用带有 -O3 编译标志的 gcc 7 编译:
main:
sub rsp, 8
mov edi, 4
call malloc
mov rdi, rax
mov QWORD PTR a[rip], rax
call free
mov edi, 4
call malloc
mov rdi, rax
mov QWORD PTR b[rip], rax
call free
xor eax, eax
add rsp, 8
ret
虽然不能流利地阅读本文,但很容易通过以下示例看出,gcc 或 clang 都没有优化 malloc 和 free(如果您想尝试使用更多编译器,适合自己,但不要不要忘记设置优化标志)。
您可以清楚地看到对“malloc”的调用,然后是对“free”的调用,两次
除非您操作大量数据,否则优化堆栈空间不太可能真正影响程序的速度。
优化动态分配的内存更为相关。 AFAIK 如果您打算这样做,您将不得不使用第三方库或运行您自己的系统,这不是一项简单的任务。
编辑:忘了提很明显,这非常依赖于编译器。