如何使ai
具有mptr
所指向的结构的实际大小?在这种情况下,ai
返回Object
指针的大小,即4个字节。我试图获得Object
mptr
的实际结构大小
#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;
}
答案 0 :(得分: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;
}
<强>更新强>
一旦你试图获得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()
方法获取容器具有已分配内存的数字元素,并通过调用{{3来调用容器中当前元素的实际数量}}
困惑?阅读有关矢量std::vector<>::size()
或只是google it。