Я использовал clang для компиляции nodejs, и я обнаружил, что есть конструктор, у которого нет 'this' ptr в качестве параметра.
define internal fastcc void @_ZN2v84base11LeakyObjectINS_8internal12_GLOBAL__N_124PageAllocatorInitializerEEC2IJEEEDpOT_() unnamed_addr #4 align 2 {
entry:
%this.addr = alloca %"struct.__gnu_cxx::__aligned_buffer"*, align 8
store %"struct.__gnu_cxx::__aligned_buffer"* @_ZZN2v88internal12_GLOBAL__N_123GetPageTableInitializerEvE6object, %"struct.__gnu_cxx::__aligned_buffer"** %this.addr, align 8
%this1 = load %"struct.__gnu_cxx::__aligned_buffer"*, %"struct.__gnu_cxx::__aligned_buffer"** %this.addr, align 8
%storage_ = getelementptr inbounds %"struct.__gnu_cxx::__aligned_buffer", %"struct.__gnu_cxx::__aligned_buffer"* %this1, i32 0, i32 0
%storage_2 = getelementptr inbounds %"struct.__gnu_cxx::__aligned_buffer", %"struct.__gnu_cxx::__aligned_buffer"* %this1, i32 0, i32 0
%0 = bitcast %"union.std::aligned_storage<8, 8>::type"* %storage_2 to i8*
%1 = bitcast i8* %0 to %"struct.std::_Head_base.44"*
call fastcc void @_ZN2v88internal12_GLOBAL__N_124PageAllocatorInitializerC2Ev(%"struct.std::_Head_base.44"* %1)
ret void
}
Я запутался, почему эта функция не имеет ptr 'this'?
Чтобы подтвердить, что эта функция является в точности конструктором, вот неоправданное имя ниже:
» c++filt _ZN2v84base11LeakyObjectINS_8internal12_GLOBAL__N_124PageAllocatorInitializerEEC2IJEEEDpOT_
v8::base::LeakyObject<v8::internal::(anonymous namespace)::PageAllocatorInitializer>::LeakyObject<>()
А вот исходный код этого класса:
template <typename T>
class LeakyObject {
public:
template <typename... Args>
explicit LeakyObject(Args&&... args) {
new (&storage_) T(std::forward<Args>(args)...);
}
T* get() { return reinterpret_cast<T*>(&storage_); }
private:
typename std::aligned_storage<sizeof(T), alignof(T)>::type storage_;
DISALLOW_COPY_AND_ASSIGN(LeakyObject);
};