2015-04-13 19 views
9

Masz naprawdę subtelny problem. Mam klasę kompilowaną przy kompilatorze MS VS 2013 C++, dla platform 32-bitowych ma rozmiar 4 bajty. Wskaźnik funkcji ma rozmiar 4 bajty. Ale kiedy ta klasa jest kompilowana z tym samym kompilatorem, ale włączona do innego projektu do produkcji biblioteki, również ukierunkowana na platformę 32-bitową, wtedy klasa ma wskaźnik * m_Function zajmujący 16 bajtów! Oczywiście, gdy tworzę instancję tej klasy z głównego projektu, uważa ona, że ​​klasa zajmuje 4 bajty i przydziela ten właśnie rozmiar pamięci, podczas gdy w rzeczywistości zajmuje 16 bajtów i powoduje przepełnienie pamięci.Rozmiar wskaźnika do funkcji elementu zmienia się jak szalony

class CC1 
    { 
    public: 
     CC1(); 

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

Wiem, że rozmiar funkcji wskaźnika do członka może się różnić. Ale qustion jest - które ustawienie kompilatora kontroluje to? Nie obchodzi mnie to, czy to 4 czy 16 bajtów - po prostu muszą być takie same. Ustawienia wyrównania elementów konstrukcyjnych są takie same dla obu projektów./vmm/vmg opcje? Brak wzmianki o nich w ustawieniach kompilatora w obu projektach.

Przy okazji, próbowałem budować dla celu x64 iw tym przypadku sizeof * m_Function ma zawsze 8 bajtów, z projektu głównego i libray.

Dziękuję.

+4

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

+0

Czy budujesz w ten sam sposób (IE debug vs release)? – NathanOliver

+2

Prawdopodobnie różne ustawienia kompilacji (wyrównanie, informacje debugowania, itp.) –

Odpowiedz

5

See here for docs page for /vm options

funkcja przypadku korzystania z „/” VMG opcję kompilatora następnie wskaźnik do członka zawsze będzie 16 bajtów jak jesteś skutecznie informując kompilator, że nie może znać rozmiar wcześniej i tak ma zakładać najgorsze (dziedziczenie wirtualne!).

Jeśli używasz '/ vmb', wówczas kompilator musi znać wzorzec dziedziczenia struktury przed użyciem, więc może użyć najbardziej wydajnej metody - w przypadku prostego dziedziczenia jest to 4 bajty.

Jest prawdopodobne, że w niektórych projektach masz zestaw "/ vmg" (który tworzy 16 bajtów klasy), aw innych nie masz (co sprawia, że ​​klasa 4 bajty).

/VMB jest niejawna domyślne - sprawdzenie linii poleceń kompilatora dla bibliotek, w których ta klasa jest dla 16 bajtów/VMG

+0

Mój problem był związany z Format debugowania informacji.Kiedy zmieniłem go z From/ZI na/Zi (dla projektu callee (?)) Problem zniknął, a wskaźnik ma 4 bajty zarówno w projekcie lib, jak i exe. Następnie próbowałem odtworzyć to ustawienie ustawienia/ZI ponownie, ale rozmiar wskaźnika nadal wynosi 4 bajty. (I nie miałem/vmz lub/vmb w moim zestawie projektów). – southerton

+1

Jednak zaznaczam twoją odpowiedź, ponieważ wtedy spróbowałem ustawić opcję/vmz w bibliotece, jak sugerowałeś, a wraz z nim rozmiar wskaźnika stał się 16 bajtów. Więc jeśli ktoś inny napotka na ten problem, to może być dla niego rozwiązaniem. – southerton