如何通过引用获取对象的大小?

时间:2010-08-13 14:26:45

标签: c++ reference sizeof

假设我有一个班级

class Foo {

:
:

}

我有另一个功能

void getf( Foo &f) {

:
:

std::cout<<sizeof f<<std::endl;
}

在我处理数据并将大量数据分配给f(Foo成员中包含的向量)之后,我需要f对象的大小

然而,正如我上面所做的那样,我总是得到16,这是参考的大小。

我做错了什么吗?怎么做?

谢谢!

8 个答案:

答案 0 :(得分:8)

sizeof返回类型的大小。通常是时间,如Vector的情况,类型的大小不一定包括类型可能指向的所有内容的累积大小。例如,类型:

class Foo {
   char* chars
}

...将显示相同的 sizeof结果,无论chars指向单个字节还是指向40Kb字符串。

答案 1 :(得分:5)

根据this IBM reference,应用于引用的sizeof返回引用对象的大小:

  

结果是。的大小   引用对象。

所以,我认为问题不是sizeof返回引用本身的大小,而是Foo保存指向其他类型的指针。

另请注意,sizeof不会告诉您vector(或使用堆的任何其他容器)内的数据大小。请考虑以下示例:

struct Foo {
    std::vector<int> v;
}

int main(int argc, char **argv) {
    Foo foo;
    std::cout << sizeof(foo) << std::endl;
    foo.v.push_back(1);
    std::cout << sizeof(foo) << std::endl;
}

Output:
24
24

答案 2 :(得分:4)

  

在我处理数据并将大量数据分配给f(Foo成员中包含的向量)之后,我需要f对象的大小

sizeof是编译时操作。它为您提供了固定大小的正变量或对象本身。如果你的对象在其他地方有指向内存的指针(那就是vector在内部使用),sizeof将永远不会深入研究它们以确定它们所指向的大小。

如果您需要测量与运行时对象关联的总字节数,那么您不能只使用简单的sizeof。你必须加起来所有的碎片。例如:sizeof(f) + f.vector_member.size() * sizeof(whaterver_type_that_vector_contains)

答案 3 :(得分:1)

在这种情况下,

sizeof会返回您班级的大小。您说您已将数据分配给Foo,但您没有定义Foo。我怀疑它看起来像这样:

class Foo
{
public:
  string my_str;
  int* my_ints;
};

然后你做这样的事情:

Foo f;
f.my_str = "Hello, Foo.";
f.my_ints = new int[1000];

...并且期望sizeof(f)现在将是Foo的大小,加上字符串的大小加上int数组的大小。但事实并非如此。 Foo永远不会改变大小,因为它没有“拥有”char数组或int数组。相反,它有一个string对象(反过来可能有一个指向char数组的指针),以及一个指向int的指针。为字符串和int数组分配的内存不是“在”Foo中,Foo指向它。

答案 4 :(得分:0)

你能否列出你的班级F的结构。我怀疑你的大小合适,sizeof会告诉你班级的大小,这是班级所有成员的大小(这是基于关于对齐和排序以及你的编译器)。它不会告诉你矢量的大小,包括它的元素,只是向量的引用大小。

答案 5 :(得分:0)

使用此测试用例:

class Foo 
{ 
    char x [100];  
} ;

void getf( Foo &f) 
{ 
    std::cout<<"sizeof f:" << sizeof f<<std::endl; 
} 

我正在打印sizeof f:100。所以,你的代码是正确的;你只是在解释错误。

答案 6 :(得分:0)

如果您有这样的课程:

class Foo
{
    std::vector<int> intVec;

    // ....
};

在编译时工作的sizeof运算符仅包含vector的实例数据成员的大小。它不会给你向量元素的总大小,这些元素存储在堆上的某个地方并由向量的某个私有成员指向。

如果您真的想弄清楚向量使用的内存总量,我认为没有一种可移植的方法可以做到这一点。向量实现可能会分配它没有使用的内存,所以如果不查看实现,你就不知道它在做什么。

答案 7 :(得分:0)

只需补充说明:

$ 8.3.2 / 3表示 - “未指明参考是否需要存储(3.7)。”

因此,不应总是假设引用占用存储空间。 sizeof应用于引用操作数时,返回原始引用的静态编译时sizeof。