我可以定义一个(键入的)常数,该常数确定不占据可执行文件中的空间

Can I define a (typed) constant which is certain not to take up space in the executable?

本文关键字:空间 常数确 可执行文件 常数 定义 一个 我可以      更新时间:2023-10-16

i有一个类型的T(为简单起见,您可以认为它的积分是不可或缺的(。我想编写一些魔术代码,之后我可以在任何上下文中使用标识符foo,在任何情况下,我可以使用以前声明的值为T的值 - 没有必要的转换。我还希望宣布(t(为 T,同样重要的是 - 我希望保证 都不会为foo分配空间,它只会在编译时有意义。

除了使用#DEFINE以外,有没有办法实现这一目标?Afaict,constexpr const不能保证避免空间分配。

无法做到这一点,因为标准不会迫使编译器优化任何内容。constexpr变量很可能是,如果它们不使用ODR,则可以优化。

如果您可以放松一些要求:

enum : T
{
  foo = some_value
};

Altough您在此处创建新类型,std::underlying_type<>将对T进行评估,并且可以在不预期T的情况下使用它(使用通常的整数转换规则(。它还不需要函数调用语法(constexpr函数可能是避免空间分配的最佳方法,但是它迫使您将语法从T val = foo更改为T val = foo(),这可能是可以或不可接受的(。

<</p>

如果编写函数足够好,这是一个最小的示例:

struct T { int value; };
constexpr T foo() { return { 42 }; }
int main()
{
    return foo().value;
}

-std=c++17 -O3编译:

main:
  mov eax, 42
  ret

满足以下条件:

#include <type_traits>
static_assert(std::is_same_v<T, decltype(foo())>);

要明确,无法保证您的编译器和链接器会从最终组件中删除foo代码,这只是很可能。

但是,保证它比函数foo的定义只会影响可执行的大小而不是分配的存储。