Вы можете «используйте сам объект», чтобы получить размер (обратите внимание, все это происходит во время компиляции, поэтому компилятор в основном выглядит типа для вас).
Object* obj;
size_t size = sizeof(*obj);
Или использовать тип непосредственно:
size_t size = sizeof(Object);
Преимущество первого способа является то, что вы можете изменить тип obj
без необходимости искать для каждого sizeof
вы сделали на этой переменной через целое кодовая.
Полный код, убирая оттенок int
:
#include <iostream>
using namespace std;
struct Object{
int t;
int g;
float gBuffer;
};
Object* CreateObject(){
return new Object;
}
int main(){
Object* mptr = CreateObject();
size_t ai = sizeof(*mptr); // or sizeof(Object)
cout << "Hello World" << endl;
return 0;
}
Update:
Это становится немного сложнее, когда вы пытаетесь получить размер C++ стандартный контейнер библиотеки ,
Подумайте о тех контейнерах, как это:
struct container {
size_t dataLength;
char* ptrToData;
};
Как вы уже поняли, размер указателя на объект не равен размеру самого объекта.
sizeof(char*) -> 4 (32bit) or 8 (64bit) bytes
sizeof(char) -> 1 byte
Аналогично, размер контейнера не то же самое, как размер данных, которые он управляет. Экземпляр c
контейнера сверху может указывать на размер 1024 байта char
, но sizeof(c)
все равно вернет 8 (на 32-битные системы).
// Note that this is not 100% correct because of the padding
// the compiler could add to the struct, but this is out of the
// scope of this answer.
container c;
sizeof(c); // resolves to
sizeof(size_t) + sizeof(char*); // resolves to
4 + 4; // 32bit
Размер данных указывает ptrToData
будет храниться в dataLength
, чтобы мы могли получить размер, просто посмотрев на контейнер.
Обратите внимание, что это совершенно отличается от SizeOf()
sizeof()
возвращает размер объекта, который известен во время компиляции. Контейнеры стандартной библиотеки C++ управляют динамической памятью, а это значит, что компилятор (и, следовательно, sizeof()
) не знает, сколько памяти вы выделите через контейнер во время выполнения.
В большинстве случаев нет причин знать о размере самого контейнера (на самом деле, если вы считаете, что вам нужно это знать, вы, вероятно, что-то делаете не так).
Что вам действительно нужно знать, например?, std::vector
- количество элементов, которые он в настоящее время удерживает. Для std::vector
вы получите числовые элементы, в которых контейнер имеет , выделенную память, путем вызова метода std::vector<>::capacity()
и фактического количества элементов, находящихся в настоящее время в контейнере, путем вызова std::vector<>::size()
.
Confused? Читайте об векторах here или просто зайдите в Google.
Никогда не наводите указатель на 'int'! Или в 'unsigned int', который затем неявно передается в' int' ... Используйте 'uintptr_t', если вам нужно сделать что-то подобное, но в этом случае нет оснований делать это вообще. Просто верните «Object *». –