在C 中,当我对其进行专业化时会实例化模板

  • 本文关键字:专业化 实例化 c++ templates
  • 更新时间 :
  • 英文 :


我知道,如果我不能专业化,模板将无法在运行时占据内存。

例如:

//code 1
template<typename T>
class foo {
  T val;
}

如果TypeName是int,则仅生成以下代码:

//code 2
template<typename T>
class foo {
  int val;
}

代码1无法生成,因此代码不能在运行时占据内存。

现在我专业代码1

//code 3
template<>
class foo<double> {
  double val;
}

代码3是否在运行时占据内存?

您可以使用https://godbolt.org/:

检查此类问题
template<typename T>
struct foo {
  foo(T v) : val(v) {}
  T val;
};
template<>
struct foo<int> {
  foo(int v) : val(v) {}
  int val;
};
template<>
struct foo<double> {
  foo(double v) : val(v) {}
  double val;
};
int main() {
    foo<int> a(5);
    foo<short> b(10);
    return a.val + b.val;
}

此代码与Clang(Trunk(-O0编译。输出为

main:                                   # @main
        push    rbp
        mov     rbp, rsp
        sub     rsp, 16
        mov     dword ptr [rbp - 4], 0
        lea     rdi, [rbp - 8]
        mov     esi, 5
        call    foo<int>::foo(int)
        lea     rdi, [rbp - 16]
        mov     esi, 10
        call    foo<short>::foo(short)
        mov     eax, dword ptr [rbp - 8]
        movsx   ecx, word ptr [rbp - 16]
        add     eax, ecx
        add     rsp, 16
        pop     rbp
        ret
foo<int>::foo(int):                         # @foo<int>::foo(int)
        push    rbp
        mov     rbp, rsp
        mov     qword ptr [rbp - 8], rdi
        mov     dword ptr [rbp - 12], esi
        mov     rax, qword ptr [rbp - 8]
        mov     ecx, dword ptr [rbp - 12]
        mov     dword ptr [rax], ecx
        pop     rbp
        ret
foo<short>::foo(short):                         # @foo<short>::foo(short)
        push    rbp
        mov     rbp, rsp
        mov     qword ptr [rbp - 8], rdi
        mov     word ptr [rbp - 10], si
        mov     rax, qword ptr [rbp - 8]
        mov     cx, word ptr [rbp - 10]
        mov     word ptr [rax], cx
        pop     rbp
        ret

您只能看到创建实际使用的方法。

最新更新