首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在C++中用std::向量进行逃逸分析

在C++中用std::向量进行逃逸分析
EN

Stack Overflow用户
提问于 2019-09-08 10:58:39
回答 1查看 470关注 0票数 1

我想知道在Clang或GCC中是否有任何优化选项可用于对std::vector进行C++中的逃逸分析。由于下面示例中的std::vector<int>不要求在堆或堆栈中分配v的实际数据。编译器实际上可以在堆栈上分配v.data()以获得更好的性能。

  1. 假设Clang/GCC不做逃逸分析,是否有特别的动机不使用逃逸分析?
  2. 假设Clang/GCC确实逃避分析,为什么v.data()&x的价值如此不同?
代码语言:javascript
复制
#include<cstdio>
#include<vector>
int main() {
    int x = 0;
    std::vector<int> v(3, 0);
    std::printf("&x: %p\n", &x);
    //std::printf("&v: %p\n", &v); // we intentionally don't print the pointer to v here.
    std::printf("v.data(): %p\n", v.data());
    return x + v[0]; // we want compiler not to optimize everything out
}

预期结果

代码语言:javascript
复制
&x: <some address>
v.data(): <some address> + 4

Clang和GCC的实际结果

代码语言:javascript
复制
[*****@localhost test]$ g++ test.cc -O3
[khanh@localhost test]$ ./a.out 
&x: 0x7ffe2af5a59c
v.data(): 0xadde70
[*****@localhost test]$ clang++ test.cc -O3
[*****@localhost test]$ ./a.out 
&x: 0x7fff66ce1ab4
v.data(): 0xfeee70

谢谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-09-09 08:00:45

Clang编译器存在转义分析。

示例代码:来自@geza https://godbolt.org/z/N1GLUI

代码语言:javascript
复制
int fn(int a, int b, int c) {
    int *t = new int[3];

    t[0] = a;
    t[1] = b;
    t[2] = c;

    int r = t[0]+t[1]+t[2];

    delete[] t;

    return r;
}

GCC

代码语言:javascript
复制
fn(int, int, int):
  push r12
  mov r12d, edx
  push rbp
  mov ebp, esi
  push rbx
  mov ebx, edi
  mov edi, 12
  call operator new[](unsigned long)
  mov DWORD PTR [rax], ebx
  add ebx, ebp
  mov rdi, rax
  mov DWORD PTR [rax+4], ebp
  mov DWORD PTR [rax+8], r12d
  add r12d, ebx
  call operator delete[](void*)
  mov eax, r12d
  pop rbx
  pop rbp
  pop r12
  ret

嘎吱声

代码语言:javascript
复制
fn(int, int, int):                               # @fn(int, int, int)
        lea     eax, [rdi + rsi]
        add     eax, edx
        ret
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57841306

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档