我想在编译时跟踪一些当前采用相同类型参数的函数的本质上的“类型”信息。这是一个例子;假设我有两个函数getThingIndex(uint64_t t)
和getThingAtIndex(uint64_t tidx)
. 第一个函数将参数视为 的编码,对thing
索引进行非平凡的计算,然后返回它。然后可以通过调用getThingAtIndex
. getThingAtIndex
,另一方面,假设您正在查询结构并且已经有一个索引。这两种方法中的后者更快,但更重要的是,我想避免因传递thing
togetThingAtIndex
或传递index
to可能导致的头痛getThingIndex
。
我正在考虑为thing
和事物索引创建类型,如下所示:
struct Thing { uint64_t thing; }
struct ThingIndex { uint64_t idx; }
然后将上述函数的签名更改为
getThingIndex(Thing t)
getThingAtIndex(ThingIndex idx)
现在,尽管Thing
和ThingIndex
编码相同的底层类型,但它们在编译时仍然是不同的,并且通过将索引
getThingIndex
或事物传递给getThingAtIndex
.
但是,我担心这种方法的开销。这些函数被调用了很多次(10s-100s 数百万次),我很好奇编译器是否会优化这些结构的创建,这些结构基本上只对编译时类型信息进行编码。如果编译器不会执行这样的优化,有没有办法以零开销创建这些类型的“丰富类型”?