2013-09-03 32 views
5

trường hợp thử nghiệm như sau:Tại sao g ++ tạo ra hai hàm tạo với các tên gọi khác nhau?

// test.cpp 
class X { 
public: 
    X(); 
}; 

X::X() { } 

void foo() { 
    X x; 
} 

Biên dịch nó và đọc các biểu tượng trong tập tin đối tượng như thế này:

[[email protected] tmp]# g++ -c test.cpp 

[[email protected] tmp]# readelf -s -W test.o 

Symbol bảng '.symtab' chứa 12 các mục:

Num: Loại Kích thước Giá trị Bind Vis Tên Ndx

0: 0000000000000000  0 NOTYPE LOCAL DEFAULT UND 
1: 0000000000000000  0 FILE LOCAL DEFAULT ABS test.cpp 
2: 0000000000000000  0 SECTION LOCAL DEFAULT 1 
3: 0000000000000000  0 SECTION LOCAL DEFAULT 3 
4: 0000000000000000  0 SECTION LOCAL DEFAULT 4 
5: 0000000000000000  0 SECTION LOCAL DEFAULT 6 
6: 0000000000000000  0 SECTION LOCAL DEFAULT 7 
7: 0000000000000000  0 SECTION LOCAL DEFAULT 5 
8: 0000000000000000 10 FUNC GLOBAL DEFAULT 1 _ZN1XC2Ev => X::X() 
9: 0000000000000000  0 NOTYPE GLOBAL DEFAULT UND __gxx_personality_v0 
10: 0000000000000000 10 FUNC GLOBAL DEFAULT 1 _ZN1XC1Ev => X::X() 
11: 000000000000000a 22 FUNC GLOBAL DEFAULT 1 _Z3foov 

[[email protected] tmp]# c++filt _ZN1XC1Ev 

X::X() 

[[email protected] tmp]# c++filt _ZN1XC2Ev 

X::X() 

Tại sao g ++ tạo ra hai nhà thầu với các tên gọi khác nhau (_ZN1XC1Ev_ZN1XC2Ev)?

+1

Một số trình biên dịch tạo ra hai cấu trúc, người ta gọi từ các chương trình sử dụng và một để gọi khi sử dụng như một cơ sở lớp của một đối tượng khác vì đôi khi có một số khác biệt về những gì cần phải làm. Tôi là một chút mơ hồ về các chi tiết và không biết nếu nó thậm chí là trường hợp ở đây vì vậy điều này có thể hoàn toàn sai, và do đó nó là một bình luận không phải là một câu trả lời :) – jcoder

Trả lời

0

Đó là lỗi đã biết từ G ++. Tham khảo Known g++ bugs

 G++ emits two copies of constructors and destructors. 
    In general there are three types of constructors (and destructors). 

    1.The complete object constructor/destructor. 
    2.The base object constructor/destructor. 
    3.The allocating constructor/deallocating destructor. 

    The first two are different, when virtual base classes are involved. 

Nếu bạn muốn tìm hiểu thêm về vấn đề này ba loại ctors và dtors, tham khảo link