c++ - 取消对结构的 int 指针地址的引用

标签 c++ pointers

如何使 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/

相关文章:

c - 关于 pthread_create() 和 pthread_join()

c - Typedef 到双整数数组

pointers - Go 中指针的常见错误

c++ - 将 const 引用传递给 C++ 中的临时字符串对象是否安全?

c++ - 在函数实现中强制执行注释

c++ - 为什么我们使用 static_cast 为 NULL

c++ - C/C++ 全局变量唯一性?

c++ - 为什么在这种情况下不调用复制构造函数 - 我的推理是否正确?

c++ - 将 std::string 的一部分复制到另一个未初始化的字符串

c - 在 C 中将数组作为参数传递