2015-04-13 9 views
9

Got ein wirklich subtiles Problem. Ich habe eine Klasse, die mit MS VS 2013 C++ Compiler kompiliert, für 32-Bit-Plattform hat die Größe von 4 Bytes. Der Funktionszeiger hat eine Größe von 4 Bytes. Aber wenn diese Klasse mit dem gleichen Compiler kompiliert wird, aber in einem anderen Projekt enthalten ist, um eine Bibliothek zu erzeugen, auch für 32-Bit-Plattformen, dann hat die Klasse den * m_Function-Zeiger, der 16 Bytes belegt! Wenn ich diese Klasse aus dem Hauptprojekt instanziiere, denkt sie natürlich, dass die Klasse 4 Byte belegt und genau diese Speichergröße zuweist, während sie in Wirklichkeit 16 Byte belegt und Speicherüberläufe verursacht.Größe des Zeigers zu Mitglied Funktion variiert wie verrückt

class CC1 
    { 
    public: 
     CC1(); 

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

Ich weiß, dass die Größe der Zeiger-zu-Element-Funktion variieren kann. Aber die Frage ist - welche Compiler-Einstellung steuert das? Es ist mir egal, ist es 4 oder 16 Bytes - nur brauchen sie gleich zu sein. Die Ausrichtungseinstellungen für Strukteile sind für beide Projekte identisch./vmm/vmg Optionen? Keine Erwähnung von ihnen in Compiler-Einstellungen in beiden Projekten.

Übrigens habe ich versucht, für x64 Ziel zu bauen und in diesem Fall sizeof * m_Function ist immer 8 Bytes, aus Haupt- und Bibliotheksprojekt.

Vielen Dank.

+4

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

+0

Bauen Sie den gleichen Weg (IE Debug vs Release)? – NathanOliver

+2

wahrscheinlich andere Build-Einstellungen (Ausrichtung, Debug-Informationen, etc ...) –

Antwort

5

See here for docs page for /vm options

Wenn Sie die ‚/ VMG‘ Compiler-Option verwenden, dann Zeiger auf Member-Funktion wird immer 16 Byte sein, wie Sie effektiv den Compiler zu sagen haben, dass es nicht die Größe vorher wissen können, und so hat das Schlimmste annehmen (virtuelle Vererbung!).

Wenn Sie '/ vmb' verwenden, muss der Compiler vor der Verwendung das Vererbungsmuster für die Struktur kennen und kann daher die effizienteste Methode verwenden - im Falle der einfachen Vererbung sind dies 4 Bytes.

Es ist wahrscheinlich, dass in einigen Projekten haben Sie '/ vmg' gesetzt (was die Klasse 16 Bytes macht) und in anderen Sie nicht (was die Klasse 4 Bytes macht).

/VMB ist die implizite Standard - überprüfen Sie Ihre Compiler-Befehlszeile für die Bibliotheken, in denen diese Klasse 16 Bytes für/vmg

+0

Mein Problem wurde damit verbunden Debug-Info-Format.Als ich es von/ZI nach/Zi (für callee project (?)) Wechselte, verschwand das Problem und der Zeiger ist 4 Bytes sowohl im lib- als auch im exe-Projekt. Dann habe ich versucht, diese Verhaltenseinstellung/ZI wieder zu aktivieren, aber die Zeigergröße beträgt immer noch 4 Bytes. (Und ich hatte/vmz oder/vmb in meinen Projekten nicht eingestellt). – southerton

+1

Allerdings markiere ich Ihre Antwort, denn dann habe ich versucht,/vmz Option auf die Lib, wie Sie vorgeschlagen, und damit die Größe des Zeigers wurde 16 Bytes. Wenn also jemand anderes auf dieses Problem stoßen würde, wäre das eine gute Lösung für ihn. – southerton