编译器优化

时间:2018-05-13 11:14:14

标签: c++ optimization compiler-optimization

示例代码非常简单,使用简单的自定义分配器和std::vector

#include <cstdlib>
#include <vector>

namespace {

template <typename T>
class MyAllocator {
 public:
  typedef T value_type;

  T* allocate(std::size_t n) {
    T* p = static_cast<T*>(std::malloc(sizeof(T) * n));
    if (p == nullptr) throw std::bad_alloc();
    return p;
  }

  void deallocate(T* p, std::size_t) {
    std::free(p);
  }
};

void bar() {
  std::vector<int, MyAllocator<int>> v;
  v.push_back(49);
}

}  // anonymous namespace

int main(int, char**) {
  ::bar();
  return 0;
}

Clang 6.0.0可以&#34;完全优化&#34;删除分配的代码。 GodBolt Here

main: # @main
  xor eax, eax
  ret

这合法吗?即使有std::malloc流,优化程序也可以放弃throw吗?

请注意GCC给出了预期的结果。

奖金问题:如果我删除匿名命名空间,编译器会生成150行汇编代码,为什么?

0 个答案:

没有答案