我最近在阅读这篇关于 D 中的结构和类的文章,作者曾评论说
...这是结构的完美候选者。原因是它只包含一个成员,一个指向 ALLEGRO_CONFIG 的指针。这意味着我可以毫无顾忌地按值传递它,因为它只是指针的大小。
这让我思考;真的是这样吗?我可以想到一些情况,在这些情况下,相信你正在“免费”传递一个结构可能会有一些隐藏的陷阱。
考虑以下代码:
struct S
{
int* pointer;
}
void doStuff(S ptrStruct)
{
// Some code here
}
int n = 123;
auto s = S(&n);
doStuff(s);
当 s 被传递给 doStuff() 时,单个指针(包装在结构中)真的是传递给函数的全部吗?在我的脑海中,似乎任何指向成员函数的指针以及结构的类型信息也会被传递。
当然,这不会是类的问题,因为它们始终是引用类型,但是结构的按值传递语义向我表明,如上所述的任何额外“隐藏”数据都将与函数一起传递给函数struct 指向 int 的指针。这可能导致程序员认为他们正在传递一个(假设是 64 位机器)8 字节指针,而实际上他们正在传递一个 8 字节指针,以及其他几个指向函数的 8 字节指针,加上对象的类型信息有多少字节。然后,粗心的程序员在堆栈上分配的数据比预期的要多得多。
我是在这里追逐阴影,还是在传递带有单个引用的结构时这是一个有效的问题,并认为您正在获得一个伪引用类型的结构?D 中是否有某种机制可以防止这种情况发生?