2011-02-09 30 views
11

Tôi nhận thấy rằng nếu tôi chạy strings trên chương trình của mình được biên soạn bởi g++, đầu ra chứa tên của các lớp khác nhau mà nó sử dụng.Tại sao g ++ lưu trữ tên lớp trong nhị phân đã biên dịch?

Chương trình được biên dịch với -O3 và không có -g hoặc -p và tên lớp vẫn còn hiện diện khi tôi loại bỏ nhị phân.

Tôi đã tự hỏi tại sao cần thiết cho g++ để lưu trữ thông tin này trong tệp nhị phân? Các tên lớp có mặt tất cả dường như là các lớp sử dụng các chức năng ảo, vì vậy tôi nghi ngờ đây là một cái gì đó để làm với nó.

+0

Điểm tham chiếu: Sử dụng 'g ++ -c blah.o blah.cpp' không bao gồm tên lớp cho đến khi sau khi liên kết nó dưới dạng tệp thi hành. – mkb

Trả lời

12

Điều này có thể liên quan đến RTTI, cụ thể là RTTI cho phép bạn truy vấn tên của lớp của một biến nhất định. Xem từ khóa typeid. Nếu đây là trường hợp thì nó sẽ giải thích tại sao nó chỉ xảy ra với các lớp có chức năng ảo - RTTI chỉ hoạt động cho các lớp với các hàm ảo.

+0

Vâng, có vẻ như là RTTI, tôi biên dịch lại với -fno-rtti và tên lớp không xuất hiện trong đầu ra chuỗi. – Xeno

+0

@Xeno: gcc trả về tên bị xáo trộn của một lớp khi bạn sử dụng 'typeid (x) .name()'. –

3

Có, nó có thể liên quan đến cách g ++ thực hiện RTTI. Nó cần để có thể tìm kiếm thông qua một cây lớp cho đúng loại trong thời gian chạy, vì vậy nó có để lưu trữ cây đó bằng cách nào đó. Bất kỳ lớp nào có hàm ảo được coi là "đa hình" và yêu cầu thông tin RTTI đặc biệt được bao gồm trong tệp thực thi. Các tiêu chuẩn không nói cách này được thực hiện mặc dù, nhưng tên lớp làm cho về ý nghĩa nhiều như bất cứ điều gì.

+0

điều này không thực sự yêu cầu lưu trữ tên, chỉ một id. Ví dụ, một hàm băm cũng sẽ hoạt động. –

+0

Điều tốt tôi chưa bao giờ tuyên bố rằng nó đã làm. –

4

g ++ đã bật RTTI theo mặc định. Sử dụng công tắc -fno-rtti nếu bạn không cần RTTI và bạn sẽ thấy các chuỗi không có.

+0

lưu ý rằng việc vô hiệu hóa RTTI cũng thường vô hiệu hóa ngoại lệ, vì RTTI và xử lý ngoại lệ thường chia sẻ một số cơ chế. –

Các vấn đề liên quan