C++中"rich type"结构的开销



我想在编译时跟踪一些函数的本质"类型"信息,这些函数当前接受相同类型的参数。这里有一个例子;假设我有两个函数getThingIndex(uint64_t t)getThingAtIndex(uint64_t tidx)。第一个函数将参数视为thing的编码,对索引进行非平凡的计算,并返回它。然后可以通过调用getThingAtIndex来获得实际的"东西"。另一方面,getThingAtIndex假设您正在查询结构并且已经有了索引。这两种方法中的后一种更快,但更重要的是,我希望避免将thing传递给getThingAtIndex或将index传递给getThingIndex可能导致的头痛。

我在考虑为thing和索引创建类型,就像这样:

struct Thing { uint64_t thing; }
struct ThingIndex { uint64_t idx; }

然后将上面函数的签名改为

getThingIndex(Thing t)
getThingAtIndex(ThingIndex idx)

现在,尽管ThingThingIndex编码相同尽管如此,它们在编译时还是不同的通过传递索引来减少犯愚蠢错误的机会getThingIndex或者一个东西到getThingAtIndex

然而,我担心这种方法的开销。的函数被调用了很多次(几千万到几亿次),我很好奇是否编译器将优化这些结构的创建,这些结构本质上只编码编译时类型信息。如果编译器不会执行这样的优化,是否有办法创建这些类型的"富类型"零开销?

看一下反汇编。

unsigned long long * x = new unsigned long long;
0110784E  push        8  
01107850  call        operator new (01102E51h)  
01107855  add         esp,4  
01107858  mov         dword ptr [ebp-0D4h],eax  
0110785E  mov         eax,dword ptr [ebp-0D4h]  
01107864  mov         dword ptr [x],eax  
*x = 5;
01107867  mov         eax,dword ptr [x]  
0110786A  mov         dword ptr [eax],5  
01107870  mov         dword ptr [eax+4],0  

和结构体

struct Thing { unsigned long long a; };
Thing * thing = new Thing;
0133784E  push        8  
01337850  call        operator new (01332E51h)  
01337855  add         esp,4  
01337858  mov         dword ptr [ebp-0D4h],eax  
0133785E  mov         eax,dword ptr [ebp-0D4h]  
01337864  mov         dword ptr [thing],eax  
thing->a = 5;
01337867  mov         eax,dword ptr [thing]  
0133786A  mov         dword ptr [eax],5  
01337870  mov         dword ptr [eax+4],0  

这两条指令没有区别。编译器不关心this->a是否是结构体的成员,它访问它就好像您刚刚声明了unsigned long long a

相关内容

  • 没有找到相关文章

最新更新