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のキャッシュライン
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バイト)
Reference
この問題について(struct、クラスのメモリ割り当て), 我々は、より多くの情報をここで見つけました https://velog.io/@dik654/struct-class의-메모리-allocationテキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol