如何使 ai
具有 mptr
指向的结构的实际大小?在这种情况下,ai
返回 4 个字节的 Object
指针的大小。我正在尝试获取 mptr
Object
的实际结构大小
#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;
}
最佳答案
您可以“使用对象本身”来获取大小(注意这一切都发生在编译时,因此编译器基本上会为您查找类型)。
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()
获得容器为其分配内存 的元素数通过调用 std::vector<>::size()
方法和容器中当前元素的实际数量.
困惑?阅读 vector here或者只是用谷歌搜索。
关于c++ - 取消对结构的 int 指针地址的引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20414096/