2010-01-26 23 views
15

Có cách nào — giống như xem kết quả xử lý trước với gcc -E — để xem đối tượng của tôi trông như thế nào khi được biên dịch thành tệp đối tượng?Bố trí đối tượng được biên dịch

Tôi đang nói về GCC, nhưng giải pháp bao gồm MSVC sẽ ổn.

+2

Bạn có nghĩa là mã hoặc dữ liệu? –

+0

Điểm tốt John. Hàm khởi tạo sẽ là mã và giống như tất cả mã thuộc về lớp, không phải là các đối tượng riêng lẻ. Do đó bạn sẽ không tìm thấy nó trong cách bố trí đối tượng. – MSalters

+1

Bạn có thể sử dụng 'g ++ -S file.cpp' để lấy đầu ra của trình biên dịch trong' file.s'. Đây có phải là những gì bạn muốn? – msandiford

Trả lời

0

Tệp đối tượng chứa dữ liệu nhị phân - mức cao nhất duy nhất mà hầu hết các trình biên dịch có thể xuất ra là trình biên dịch, vì vậy nếu bạn không thể đọc được rằng bạn đã hết may mắn. Tuy nhiên, hãy xem this question để biết thêm thông tin trong khu vực này.

0

Bạn có thể kiểm tra bố cục của tệp nhị phân và nội dung của chúng bằng cách sử dụng tệp bản đồ. Sử dụng /MAP cho VC và -Map hoặc --print-map cho gcc.

0

Câu hỏi của bạn hơi khó hiểu.

Nếu bạn muốn xem kết quả xử lý trước bằng MSVC, bạn có thể sử dụng /E, /P/ hoặc /EP.

Có tùy chọn không có giấy tờ trong MSVC để hiển thị bố cục dữ liệu của cấu trúc và lớp học. Tôi đang gặp khó khăn khi tìm nó ngay bây giờ.

+0

> Có một tùy chọn không có giấy tờ trong MSVC để hiển thị bố cục dữ liệu của cấu trúc và các lớp. Tôi đang gặp khó khăn khi tìm nó ngay bây giờ. đây chính xác là những gì tôi đang tìm kiếm! – user257620

+2

Cuối cùng tôi đã cố gắng khai thác các thiết bị chuyển mạch đó: '/ d1reportSingleClassLayoutXXX' và'/d1reportAllClassLayout'. –

5

Đối với các tệp thi hành được biên dịch GCC, hãy kiểm tra Pahole. Nó sẽ chỉ cho bạn cách trình biên dịch trình bày các cấu trúc/lớp của bạn và liệu chúng có "lỗ hổng" trong chúng hay không. Lỗ được đệm do các quy tắc liên kết bộ nhớ.

+1

(+1) công cụ naice –

+1

liên kết pahole đã chết – ofloveandhate

+0

@ofloveandhate Tôi đã sửa liên kết. – paxos1977

0

Một hàm tạo chỉ là một hàm khác (trừ khi nó nằm trong hàng). Các tệp đối tượng chứa rất nhiều thông tin cho trình liên kết; vì vậy bạn sẽ có thể tìm thấy hàm trong tệp .a (tên hàm sẽ bị xáo trộn).

19

Đối với Visual C++:

tôi cuối cùng đã được quản lý để khai thác các (ẩn tốt!) Cờ biên dịch không có giấy tờ mà MSVC++ hỗ trợ sử dụng thông tin từ herehere. Dưới đây là:

/d1reportSingleClassLayoutXXX 
/d1reportAllClassLayout 

(thay thế XXX với tên lớp)

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