struct、クラスのメモリ割り当て


#include <iostream>
using namespace std;
struct ST {
	long a;
    int b;
    short c;
}

int main() {
	cout << sizeof(ST) << '\n';
    return 0;
}
で、long=8バイト、int=4 bバイト、short=2 bytesのため、14バイトと予想される.
結果は16バイトです.
これはmemory accessモードで、コンパイラがそれらの間に埋め込みを追加するためです.
memory access pattern
struct ST {
	char c1;
   int i4a;
   int i4b;
   double d8;
}

c 11 1 bytesは、4倍しか入らないintに対して3バイトpaddingを生成します.
intは4の倍数で4バイトに入る.
doubleは8バイトで、メモリは8の倍数でしか割り当てられないため、8の倍数16を作成するには4バイトのpadding、8バイトが必要です.
合計サイズ24バイトの構造体.
CPUのキャッシュライン
  • CPUがメモリからデータをインポートする場合、バイト単位でデータをインポートするのではなく、キャッシュラインを満たすのに十分なデータ(メモリのページング技術と同様)
  • をインポートする.
  • マルチプロセッサは、同じキャッシュメモリを参照することができるので、最初にアクセスしたCPUによってほぼ同時に参照され、変更される.
    2番目にアクセスしたCPUでは、更新前に値の読み取りの問題が発生する場合があります.
  • #include <iostream>
    class Cat
    {
    public:
    	void printCat();
    private:
    	int age;
    	int weight;
    };
    int main()
    {
    	Cat cat1;
    	Cat cat2;
    
    	Cat * catPtr = &cat1;
    	std::cout << sizeof(catPtr) << std::endl;
    	
    	return 0;	
    }
    表示
    intが2つあるので,構造体の大きさは8バイトと考えられる.
    メンバー関数printCat()があるため、その関数へのポインタが生成され、そのポイントを格納するために8バイトが追加され、構造体のサイズが16バイトとみなされる場合があります.
    答えは8バイトで、関数は構造体の大きさに影響しません.
    64ビット環境では、ポインタはタイプに関係なく常に8バイト(64ビット=8バイト、アドレスを表す場合は8バイト)