假设我有一个班级
class Foo {
:
:
}
我有另一个功能
void getf( Foo &f) {
:
:
std::cout<<sizeof f<<std::endl;
}
在我处理数据并将大量数据分配给f(Foo成员中包含的向量)之后,我需要f对象的大小
然而,正如我上面所做的那样,我总是得到16,这是参考的大小。
我做错了什么吗?怎么做?
谢谢!
答案 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。