在 C++ 中获取 class 成员的 sizeof
Getting sizeof a member of the class in C++
我构建了一个名为 IntSet 的 class。我的问题是我不想存储另一个元素,即我想在 elem
数组中引入的最大元素数量。因此,在 add 方法或任何其他方法中,我想使用此操作找出我在 IntSet (int dim_max)
构造函数中分配的最大大小:
int n = sizeof(elem) / sizeof(*elem); //or sizeof(elem) / sizeof(int);
cout << "N is = " << n;
然而,这不起作用,每次 n 为 1,即使我分配 elem = new int[dim_max];
,其中 dim_max 是我从键盘读取的变量,它比 1 大得多。这是代码:
#include <iostream>
using namespace std;
class IntSet{
int *elem;
int dim;
public:
IntSet (int dim_max) {
dim = -1;
elem = new int[dim_max];
}
void add(int new_el) {
int n = sizeof(elem) / sizeof(int);
cout << "N is =" << n;
for(int i = 0; i < n; i++) {
if(elem[i] == new_el) {
cout << "It's already there !";
return;
}
}
dim++;
if(dim == n) {
elem = (int*)realloc(elem, sizeof(int) * (n + 1));
global_var++;
}
elem[dim] = new_el;
}
};
首先你除以两个非双精度值所以结果不是你所期望的
12/8 是 1.
根据体系结构,指针的大小为 8 或 4。
您认为 sizeof
返回数组的大小,这仅适用于自动数组而不是动态数组。
elem
是一个指针,sizeof(ptr)
总是固定的。在 32 位机器上 sizeof 指针是 32 位(4 字节),而在 64 位机器上它是 8 字节。无论它们指向什么数据类型,它们都有固定的大小。
因此,您正在进行的计算 sizeof(elem)/sizeof(*elem)
将始终产生 1,因为它与 sizeof(int)
匹配。如果 elem
是一个具有预定大小的数组,这将起作用。
要跟踪当前大小,您需要有另一个变量。
另一件事是不要混用 new
和 realloc
。在使用 C++ 时始终使用 new
。
sizeof
运算符在编译时处理类型。由于 elem
是 int*
,因此 sizeof(elem)
与 sizeof(int*)
相同。而 *elem
是一个 int
,所以 sizeof(*elem)
是 sizeof(int)
。
所以最后,无论您在 elem
中输入什么,您的公式都等同于 sizeof(int*)/sizeof(int)
。没有标准的方法可以找出分配给指针的数组元素的数量。
为了您的目的,您要么必须在 class 中跟踪 dim_max
,要么最好用更好的 vector
代替指针和数组的使用。
Vectors 在标准库中提供了一个 size()
function, and allow to easily add new element dynamically at the end using push_back()
. Maybe it could interest you as well: there is also a set
容器。
因为,elem
是一个指针。所以,每次你做 sizeof(elem)
或 sizeof(*elem);
都会分别给你数据类型和指针的大小。
如果你没有使用过动态分配,那么回答就可以了。
我建议您使用 STL 容器或存储最大大小作为数据成员。
我构建了一个名为 IntSet 的 class。我的问题是我不想存储另一个元素,即我想在 elem
数组中引入的最大元素数量。因此,在 add 方法或任何其他方法中,我想使用此操作找出我在 IntSet (int dim_max)
构造函数中分配的最大大小:
int n = sizeof(elem) / sizeof(*elem); //or sizeof(elem) / sizeof(int);
cout << "N is = " << n;
然而,这不起作用,每次 n 为 1,即使我分配 elem = new int[dim_max];
,其中 dim_max 是我从键盘读取的变量,它比 1 大得多。这是代码:
#include <iostream>
using namespace std;
class IntSet{
int *elem;
int dim;
public:
IntSet (int dim_max) {
dim = -1;
elem = new int[dim_max];
}
void add(int new_el) {
int n = sizeof(elem) / sizeof(int);
cout << "N is =" << n;
for(int i = 0; i < n; i++) {
if(elem[i] == new_el) {
cout << "It's already there !";
return;
}
}
dim++;
if(dim == n) {
elem = (int*)realloc(elem, sizeof(int) * (n + 1));
global_var++;
}
elem[dim] = new_el;
}
};
首先你除以两个非双精度值所以结果不是你所期望的 12/8 是 1.
根据体系结构,指针的大小为 8 或 4。
您认为 sizeof
返回数组的大小,这仅适用于自动数组而不是动态数组。
elem
是一个指针,sizeof(ptr)
总是固定的。在 32 位机器上 sizeof 指针是 32 位(4 字节),而在 64 位机器上它是 8 字节。无论它们指向什么数据类型,它们都有固定的大小。
因此,您正在进行的计算 sizeof(elem)/sizeof(*elem)
将始终产生 1,因为它与 sizeof(int)
匹配。如果 elem
是一个具有预定大小的数组,这将起作用。
要跟踪当前大小,您需要有另一个变量。
另一件事是不要混用 new
和 realloc
。在使用 C++ 时始终使用 new
。
sizeof
运算符在编译时处理类型。由于 elem
是 int*
,因此 sizeof(elem)
与 sizeof(int*)
相同。而 *elem
是一个 int
,所以 sizeof(*elem)
是 sizeof(int)
。
所以最后,无论您在 elem
中输入什么,您的公式都等同于 sizeof(int*)/sizeof(int)
。没有标准的方法可以找出分配给指针的数组元素的数量。
为了您的目的,您要么必须在 class 中跟踪 dim_max
,要么最好用更好的 vector
代替指针和数组的使用。
Vectors 在标准库中提供了一个 size()
function, and allow to easily add new element dynamically at the end using push_back()
. Maybe it could interest you as well: there is also a set
容器。
因为,elem
是一个指针。所以,每次你做 sizeof(elem)
或 sizeof(*elem);
都会分别给你数据类型和指针的大小。
如果你没有使用过动态分配,那么回答就可以了。
我建议您使用 STL 容器或存储最大大小作为数据成员。