繁体   English   中英

在函数内定义结构是否有任何“惩罚”?

[英]Are there any "penalties" for defining a struct inside a function?

只是出于好奇..

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


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

在C ++ 11中,没有 - 没有惩罚。 我甚至认为这是一个非常好的风格,不会污染任何“更明显”的范围与您的实现细节,当然,除非您想在其他地方重用该仿函数。 但是, lambdas本质上是这个想法的浓缩形式,如果你只是使用struct作为functor, 通常应该是首选 对于所有类型的数据,它完全没问题,尽管它通常在这方面与std::pairstd::tuple竞争。

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

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

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

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

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

如果这是用于C ++,那么创建一个类并使结构保持私有或受到保护以及编写适当的get / set / manipulate方法可以完成剩下的工作。

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

如果某些成员函数基于编译时约束不可调用,则不能使用本地定义的结构来创建模板化类型的对象。

例子:

template<typename T>
concept C = requires(T t) { { t.unsupported() }; };

template <typename T>
struct X {
    void unsupported() { static_assert(std::is_void_v<T>); }
};
static_assert(C<X<int>>);

template <typename T>
C auto make()
{
    struct Y {
        void unsupported() { static_assert(std::is_void_v<T>); }
    };
    return Y{};
}

int main()
{
    C auto x = X<int>{};      // compiles fine
    C auto y = make<int>();   // error: static assertion failed
    return 0;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM