我可以定义一个(键入的)常数,该常数确定不占据可执行文件中的空间
Can I define a (typed) constant which is certain not to take up space in the executable?
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()
,这可能是可以或不可接受的(。
如果编写函数足够好,这是一个最小的示例:
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
的定义只会影响可执行的大小而不是分配的存储。
相关文章:
- 为什么两个不同的未命名名称空间可以共存于一个cpp文件中
- 命名空间中具有.h和.cpp文件的类
- 从父命名空间重载类型
- 当在同一名称空间中有两个具有相同签名的函数时,会发生什么
- 在命名空间中定义函数还是限定函数
- C++:对不存在的命名空间使用命名空间指令
- 通过继承类使用来自不同命名空间的运算符
- 使用命名空间时出现多个定义错误
- OpenGL相机和相机空间转型的困惑
- CUDA内核和数学函数的显式命名空间
- 打印第二列时的2d字符矢量打印空间
- 嵌套的匿名命名空间
- CMakeLists.txt中的命名空间表示法
- 类是C++中的命名空间吗
- 在命名空间中使用全局命名空间中的函数
- 静态类常数与常数名称空间
- 我可以定义一个(键入的)常数,该常数确定不占据可执行文件中的空间
- C :将外部链接与未命名的名称空间使用常数变量
- 在另一个带有名称空间的标头文件中定义常数
- 在常数空间和O(n)时间内找到重复条目的算法