将int指针地址解除引用到结构

时间:2013-12-06 01:08:05

标签: c++ pointers

如何使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;
}

1 个答案:

答案 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。