2 つの異なる変数に割り当てられたメモリの構造を確認したいと思います。
この背後にある注意は、さまざまなデータ型を格納する順序でメモリがどのように構造化されているかを理解することです。
C++ ではどのように行われますか?
//how to show, whats in memory in &var1 &var2 ?
short var1 = 2;
string var2 = "bla";
MSVS を使用している場合は、Memory
タブを開いて、調べたいアドレスを書き込むことができます。
あなたはデバッグにいる必要があります - Debug
-> Windows
-> Memory
。
Eclipse を使用している場合は、デバッグ パースペクティブでメモリ ビューを使用できます。
それか、単に変数へのポインターを作成し、それらの内容を調べます。
short var1 = 2;
string var2 = "bla";
char* pVar1 = (char*)&var1; //point to memory storing var1
char* pVar2 = (char*)&var2; //point to memory storing var2
私は通常、次のようなものを使用します。
template< typename T >
class Dump
{
public:
explicit Dump( T const& obj ) ;
void print( std::ostream& dest ) const ;
friend std::ostream& operator<<( std::ostream& dest, Dump const& source )
{
source.print( dest );
return source;
}
private:
unsigned char const*myObj ;
} ;
template< typename T >
inline Dump< T >
dump(
T const& obj )
{
return Dump< T >( obj ) ;
}
template< typename T >
Dump< T >::Dump(
T const& obj )
: myObj( reinterpret_cast< unsigned char const* >( &obj ) )
{
}
template< typename T >
void
Dump< T >::print(
std::ostream& dest ) const
{
IOSave saver( dest ) ;
dest.fill( '0' ) ;
dest.setf( std::ios::hex, std::ios::basefield ) ;
char const* baseStr = "" ;
if ( (dest.flags() & std::ios::showbase) != 0 ) {
baseStr = "0x" ;
dest.unsetf( std::ios::showbase ) ;
}
unsigned char const* const
end = myObj + sizeof( T ) ;
for ( unsigned char const* p = myObj ; p != end ; ++ p ) {
if ( p != myObj ) {
dest << ' ' ;
}
dest << baseStr << std::setw( 2 ) << (unsigned int)( *p ) ;
}
}
IOSave
flags
コンストラクターでフォーマット状態 ( 、
fill
および)を保存precision
し、デストラクターでそれらを復元する単純なクラスです。