gpt4 book ai didi

c++ - 在 C++ 中,模板在我专门化时是否实例化了?

转载 作者:太空宇宙 更新时间:2023-11-04 12:33:52 25 4
gpt4 key购买 nike

我知道如果我不能专门化模板,它就不会在运行时占用内存。

例如:

//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

如您所见,只会创建实际使用的方法。

关于c++ - 在 C++ 中,模板在我专门化时是否实例化了?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57286814/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com