2013-12-06 2 views
0

Как вы принимаете ai с фактическим размером какой-либо структуры, что mptr указывает на? В этом случае ai возвращает размер указателя Object, который равен 4 байтам. Я пытаюсь получить фактический размер структуры в Object указываемого mptrВызов постороннего кода int указателя к структуре

#include <iostream>  
using namespace std; 

struct Object { 
    int t; 
    int g; 
    float gBuffer; 
}; 

int CreateObject() { 
    Object* obj = new Object; 
    return (unsigned int)obj; 
} 


int main() { 
    unsigned int mptr = CreateObject(); 
    size_t ai = sizeof((Object*)mptr); 

    cout << "Hello World" << endl; 
    return 0; 
} 
+3

Никогда не наводите указатель на 'int'! Или в 'unsigned int', который затем неявно передается в' int' ... Используйте 'uintptr_t', если вам нужно сделать что-то подобное, но в этом случае нет оснований делать это вообще. Просто верните «Object *». –

ответ

2

Вы можете «используйте сам объект», чтобы получить размер (обратите внимание, все это происходит во время компиляции, поэтому компилятор в основном выглядит типа для вас).

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.

+1

Но гораздо интереснее объяснить размер умножения (например, '(sizeof * obj)') –

+0

Мне нравится эта шутка, так как я слышал ее в первый раз. –

+0

, а если структура объекта содержит вектор? – user2977702

Смежные вопросы