2015-04-13 18 views
9

Có một vấn đề thực sự tinh tế. Có một lớp được biên dịch với trình biên dịch MS + 2013 C++, cho nền tảng 32 bit có kích thước 4 byte. Con trỏ hàm có sizeof 4 byte. Nhưng khi lớp này được biên dịch với trình biên dịch này nhưng được đưa vào dự án khác nhau để tạo ra thư viện, cũng nhắm tới nền tảng 32 bit, thì lớp đó có con trỏ * m_Function chiếm 16 byte! Tất nhiên, khi tôi instantiating lớp này từ dự án chính nó nghĩ rằng lớp chiếm 4 byte và phân bổ kích thước bộ nhớ rất, trong khi trong thực tế nó chiếm 16 byte và gây ra overruns bộ nhớ.Kích thước của con trỏ đến chức năng thành viên khác nhau như điên

class CC1 
    { 
    public: 
     CC1(); 

     void (CC1:: *m_Function)(); 
    }; 

Tôi biết rằng kích thước hàm từ con trỏ đến thành viên có thể thay đổi. Nhưng qustion là - thiết lập trình biên dịch nào kiểm soát điều này? Tôi không quan tâm là nó 4 hoặc 16 byte - chỉ cần chúng giống nhau. Cấu trúc thiết lập căn chỉnh thành viên là như nhau cho cả hai dự án./vmm/vmg tùy chọn? Không đề cập đến chúng trong cài đặt trình biên dịch trong cả hai dự án.

Nhân tiện, tôi đã thử xây dựng cho mục tiêu x64 và trong trường hợp này sizeof * m_Function luôn là 8 byte, từ dự án chính và libray.

Cảm ơn bạn.

+4

http://blogs.msdn.com/b/oldnewthing/archive/2004/02 /09/70002.aspx – Lectral

+0

Bạn đang xây dựng theo cùng một cách (gỡ lỗi IE và phát hành)? – NathanOliver

+2

có thể là các cài đặt xây dựng khác nhau (căn chỉnh, thông tin gỡ lỗi, v.v ...) –

Trả lời

5

See here for docs page for /vm options

-để con trỏ thành viên Nếu bạn sử dụng '/ VMG' tùy chọn biên dịch sau đó chức năng sẽ luôn là 16 byte như bạn đang có hiệu quả kể trình biên dịch rằng nó có thể không biết kích thước trước và do đó có giả định tồi tệ nhất (thừa kế ảo!).

Nếu bạn sử dụng '/ vmb' thì trình biên dịch phải biết về mẫu kế thừa cho cấu trúc trước khi sử dụng và do đó có thể sử dụng phương pháp hiệu quả nhất - trong trường hợp thừa kế đơn giản, 4 byte.

Có khả năng là trong một số dự án bạn đã có tập hợp '/ vmg' (làm cho lớp 16 byte) và ở những người khác bạn không (làm cho lớp 4 byte).

/VMB là mặc định ngầm - kiểm tra dòng lệnh trình biên dịch của bạn cho các thư viện nơi lớp này là 16 byte cho/VMG

+0

Sự cố của tôi đã được kết nối với Định dạng thông tin gỡ lỗi.Khi tôi chuyển nó từ/ZI sang/Zi (đối với dự án callee (?)) Thì vấn đề bị biến mất và con trỏ là 4 byte trong cả dự án lib và exe. Sau đó, tôi đã cố gắng tái tạo cài đặt hành vi này/ZI một lần nữa, nhưng kích thước con trỏ vẫn là 4 byte. (Và tôi đã không có/vmz hoặc/vmb trong các dự án của tôi được thiết lập). – southerton

+1

Tuy nhiên, tôi đánh dấu câu trả lời của bạn vì sau đó tôi đã thử thiết lập/vmz tùy chọn trên lib, như bạn đã đề xuất, và với nó kích thước của con trỏ đã trở thành 16 byte. Vì vậy, nếu ai đó sẽ gặp phải vấn đề này có thể là một giải pháp rất tốt cho anh ta. – southerton

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