在 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 是一个具有预定大小的数组,这将起作用。 要跟踪当前大小,您需要有另一个变量。

另一件事是不要混用 newrealloc。在使用 C++ 时始终使用 new

sizeof 运算符在编译时处理类型。由于 elemint*,因此 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 容器或存储最大大小作为数据成员。