系统相关
首页 > 系统相关> > C零大小的数组,不需要内存空间?

C零大小的数组,不需要内存空间?

作者:互联网

在声明模板化类的成员变量时,是否有办法根据某些模板参数的值使其需要零内存?

一个例子是定义类似std :: array< T,n>的东西.当n == 0时,这将需要零空间.

例如:

template<int num_optional_args> class C {
    int some_variable;
    std::array<int,num_optional_args> optional_args;
};

有没有办法在num_optional_args == 0时消除optional_args的开销?

大多数std :: array< T,n>的实现即使n == 0,也为一个T元素保留空间.

还有其他方法可以保留零空间吗?
为什么这不是C标准的一部分?

解决方法:

您可以专门化您的类型,以便在数字为零时不存在optional_args.如果您需要存在该对象,那么对象可以存在并且可以被引用而实际上不占用空间的唯一方式是通过空基类优化.

您可以通过以下方式使用它:

template<int num_optional_args>
class optional_args {
    std::array<int,num_optional_args> args
public:
    // whatever interface you want for the optional args.
    void foo(int n) {
        if (n < num_optional_args)
            args[n];
        throw std::runtime_error("out of range");
    }
};

template<>
class optional_args<0> {
public:
    // whatever interface you want for the optional args, specialized for 0 args.
    void foo(int n) {
        throw std::runtime_error("out of range");
    }
};

template<int num_optional_args>
class C : optional_args<num_optional_args> {
    int some_variable;
    void bar() {
        for (int i=0; i<num_optional_args; ++i) {
            optional_args::foo(i);
        }
    }
};

标签:stdarray,c,arrays,templates,memory-management
来源: https://codeday.me/bug/20190831/1778749.html