示例代码非常简单,使用简单的自定义分配器和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行汇编代码,为什么?