出于好奇......
正如标题所说:在函数内部定义结构是否存在“惩罚”?(如性能,内存,糟糕的编程习惯等)< / p>
P.S。我知道,在函数内定义(非模板)仿函数是一种常见的做法,但仍然是......)
答案 0 :(得分:20)
在C ++ 11中,没有 - 没有惩罚。我甚至认为这是一个非常好的风格,不会污染任何“更明显”的范围与您的实现细节,当然,除非您想在其他地方重用该仿函数。但是, lambdas 本质上是这个想法的浓缩形式,如果你只是使用结构作为仿函数,通常应该是首选的。对于所有类型的数据,它完全没问题,尽管在这方面它通常会与std::pair
和std::tuple
竞争。
在C ++ 03中,你不能使用这样的结构作为模板参数,因为这些参数需要有外部链接(不过Visual Studio允许你这样做)。使用具有多态接口的这种结构仍然是有用的。
答案 1 :(得分:5)
由于这纯粹是一个可见性问题,我无法想象会出现性能或内存损失的合理情况。
答案 2 :(得分:0)
如果您正在使用C ++ 03,那么从技术上讲,您不能使用本地定义的结构作为模板参数,但某些编译器(即MSVC)允许它。
答案 3 :(得分:0)
我知道你问过性能,但我想知道另一个问题。你要求C和C ++还是其中一种语言?我猜想你想在函数中定义一个结构以达到范围或隐藏结构。
对于C,您可以通过在单独的模块中定义和声明结构并使其静态来隐藏事物。然后,您可以提供访问功能,就像您对C ++类的成员一样。您可以在.h文件中包含需要访问结构的模块的函数声明。
如果这是针对C ++的,那么创建一个类并使结构保持私有或受到保护以及写入时,相应的get / set / manipulate方法将处理其余的事情。
如果您修改了原始帖子并扩展了原因,那么您就提出了一个很好的问题。