【发布时间】:2019-03-22 16:26:09
【问题描述】:
在某些情况下,我们使用标签来区分功能。一个标签通常是一个空结构体:
struct Tag { };
假设我有一个函数,它使用这个标签:
void func(Tag, int a);
现在,让我们调用这个函数:
func(Tag(), 42);
然后查看生成的 x86-64 反汇编,godbolt:
mov edi, 42
jmp func(Tag, int) # TAILCALL
没关系,标签被完全优化掉了:没有为它分配寄存器/堆栈空间。
但是,如果我查看其他平台,则该标签有些存在。
在 ARM 上,r0 被用作标签,它被归零(似乎没有必要):
mov r1, #42
mov r0, #0
b func(Tag, int)
在 MSVC 中,ecx 被用作标签,它从堆栈中“初始化”(再次,似乎没有必要):
movzx ecx, BYTE PTR $T1[rsp]
mov edx, 42 ; 0000002aH
jmp void func(Tag,int) ; func
我的问题是:有没有一种标签技术,在所有这些平台上都同样优化?
注意:我没有找到 SysV ABI 在哪里指定可以在参数传递时优化空类...(甚至,Itanium C++ ABI 说:“空类的传递与普通类没有什么不同” .)
【问题讨论】:
-
你可以专门化一个模板,但我真的不喜欢专门化,因为它们有很多缺点。
标签: c++ arm x86-64 calling-convention abi