Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/154.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++中不使用sieof的对象的大小_C++ - Fatal编程技术网

C++中不使用sieof的对象的大小

C++中不使用sieof的对象的大小,c++,C++,这是一个采访问题: 假设有一个类只有一个int成员。您不知道int将占用多少字节。你不能查看类的实现,比如说它是一个API。但您可以创建它的对象。如果不使用sizeof,如何找到int所需的大小 他也不会接受使用比特集 您能推荐最有效的方法来解决这个问题吗?使用指针代数: #include <iostream> class A { int a; }; int main() { A a1; A * n1 = &a1; A * n2 = n1+

这是一个采访问题:

假设有一个类只有一个int成员。您不知道int将占用多少字节。你不能查看类的实现,比如说它是一个API。但您可以创建它的对象。如果不使用sizeof,如何找到int所需的大小

他也不会接受使用比特集

您能推荐最有效的方法来解决这个问题吗?

使用指针代数:

#include <iostream>

class A
{
    int a;
};

int main() {
    A a1;
    A * n1 = &a1;
    A * n2 = n1+1;
    std::cout << int((char *)n2 - (char *)n1) << std::endl;
    return 0;
}

下面的程序演示了一种计算对象大小的有效方法

#include <iostream>

struct Foo
{
   int f;
};

int main()
{
   // Create an object of the class.
   Foo foo;

   // Create a pointer to it.
   Foo* p1 = &foo;

   // Create another pointer, offset by 1 object from p1
   // It is legal to compute (p1+1) but it is not legal
   // to dereference (p1+1)
   Foo* p2 = p1+1;

   // Cast both pointers to char*.
   char* cp1 = reinterpret_cast<char*>(p1);
   char* cp2 = reinterpret_cast<char*>(p2);

   // Compute the size of the object.
   size_t size = (cp2-cp1);

   std::cout << "Size of Foo: " << size << std::endl;
}

指针算法可以在不实际创建任何对象的情况下使用:

class c {
    int member;
};

c *ptr = 0;
++ptr;
int size = reinterpret_cast<int>(ptr);
或者:

int size = reinterpret_cast<int>( static_cast<c*>(0) + 1 );

还有一种不使用指针的替代方法。如果下次面试时他们也禁止指点,你可以用它。你的评论面试官让我想到了溢出和下溢可能也指向了这种方法或类似的方法

#include <iostream>
int main() {
    unsigned int x = 0, numOfBits = 0;
    for(x--; x; x /= 2) numOfBits++;
    std::cout << "number of bits in an int is: " << numOfBits;
    return 0;
}

它获取在无符号模式下递减零的无符号整数的最大值,然后除以2,直到达到零。要获得字节数,请除以字符位。

对我来说,听起来更像是一个模糊的谜语,而不是一个恰当的面试问题。制作一个对象数组,比较第一个和第二个条目的内存地址。如果类或超类具有虚拟成员函数/构造函数,则可能仍然无法获得int的大小。请指出sizeof正是完成该任务的工具,任何专业代码都不应再次尝试实现它。然后提供伪码int数组[2];打印&a[1]-&a[0];。你不一定需要一个合适的数组,简单的点运算可以推断出答案。@CuriousKrish。你不会喜欢为一家提出此类面试问题的公司工作。n1-未定义。您只能对属于同一数组或超过末尾的指针执行指针算术。@FrançoisAndrieux,molbdnilo,谢谢,只声明了a1;不调用UB@Galik,谢谢你指点。我认为这可能取决于架构/实现,添加了std::abs…我不确定是否可以考虑避免sizeof的要求valid@Slava,我认为这对家庭作业和面试问题来说是公平的。我想知道他们是否会问,如果钢笔或铅笔被禁止使用,你将如何在一张纸上写一段文字?在秘书面试中。我打赌使用offsetof who会更有效,因为它不需要任何内存分配。@Slava,offsetof计算成员从结构开始的偏移量。我不确定这对OP想要做的事情会起什么作用。