28

只是出于好奇。。

正如标题所说:在函数内部定义结构是否有任何“惩罚”?(如性能、内存、不良编程习惯等)


PS我知道,在函数内部定义(非模板)函子是一种常见的做法,但仍然......)

4

4 回答 4

21

在 C++11 中,没有 - 没有惩罚。我什至认为它是一种很好的风格,不会用你的实现细节污染任何“更可见”的范围,当然,除非你想在其他地方重用那个仿函数。然而,lambda本质上是这个想法的一种浓缩形式,如果你只是将结构用作函子,通常应该首选。对于所有类型的数据,它都非常好,尽管它通常在这方面std::pair与之竞争。std::tuple

在 C++03 中,您不能将这样的结构用作模板参数,因为这些参数需要具有外部链接(尽管 Visual Studio 允许您这样做)。将这种结构与多态接口一起使用仍然很有用。

于 2012-06-11T12:24:29.147 回答
5

由于这纯粹是一个可见性问题,我无法想象会出现性能或内存损失的合理场景。

于 2012-06-11T12:21:57.763 回答
0

如果您使用的是 C++03,那么从技术上讲,您不能使用本地定义的结构作为模板参数,但某些编译器(即 MSVC)允许这样做。

于 2012-06-11T12:24:31.547 回答
0

我知道您询问了性能,但我想知道另一个问题。您是要求 C 和 C++ 还是其中一种语言?我猜测您想在函数中定义结构以用于范围或隐藏结构。

对于 C,您可以通过在单独的模块中定义和声明结构并使它们成为静态来隐藏事物。然后,您可以提供访问函数,就像您为 C++ 类的成员提供的一样。对于需要访问结构的那些模块,您可以在 .h 文件中包含函数声明。

如果这是针对 C++ 的,那么创建一个类并将结构设为私有或受保护,同时编写适当的 get/set/manipulate 方法来处理其余的工作。

如果您编辑了原始帖子并扩展了您提出此问题的原因,那么您提出了一个很好的问题。

于 2012-06-11T12:25:01.990 回答