我将提供一些关于C ++和数据结构的课程,并检查学生和#39;进步我希望他们能够发展我所谈论的结构。我猜这是数据结构类的常用方法。但是我想要更多,我希望学生能够快速反馈他们缺少的东西,所以我为那些检查行为的类开发了几个单元测试,并给出了错误的即时结果。
这在过去两个学期一直运作正常,但我希望在自动化校正方面更进一步。我一直在研究如何检查课程的内部组件,因此我可以知道某人是否正确实施了node* root
和size_t size
并且未使用过的树例如,其他不必要的属性。
我知道我可以使用sizeof
粗略估计对象大小,但结果并不精确。它经常与我的期望不同,例如:我测试了创建一个带有指针(8个字节)和一个int(4个字节)的类,但是sizeof
是28.从我学到的,可能这有与虚函数表和其他对齐的东西有关。
那么,如果有人以正确和预期的方式编码数据结构,我还能走多远呢?我如何检查某人是否#include <list>
并且创建了一个适配器(为此我知道我可以删除包含但是无论如何)?
答案 0 :(得分:0)
让我们将这个答案分成两部分,我们将在is_standard_layout
的回复中分开。
is_standard_layout
将返回false
,表示该类为virtual
。除了virtual
函数指针之外,virtual
类将包含父母的所有成员。您可以找到更多信息here。基本上,在这里查找成员数量的最佳选择是sizeof
所讨论的课程减少sizeof(void*)
并且大小与virtual class
&#39相同;成员。
is_standard_layout
将返回true
,这意味着这不是virtual class
。在这种情况下,我们可以使用offsetof
来查找头信息之后的第一个成员变量。使用指向对象的指针和sizeof
查找对象的结尾,您将测量到offsetof
返回的点的距离。
这两种方法都应该产生类中成员的大小。确定班级规模的允许范围是优先考虑的问题。但是将评估放在static_assert
中将允许您提供一个编译时间消息,指出断言的原因。