gpt4 book ai didi

c++ - VS 是否将转换优化为相同类型?

转载 作者:塔克拉玛干 更新时间:2023-11-03 06:51:09 26 4
gpt4 key购买 nike

int a = (int)5;

VS 是否对其进行了优化(删除类型转换)?上面的情况很简单,但我正在编写一些在构造函数中采用任意类型参数的模板类:

template <typename U>
MyClass(U argument)
{
T a = (T)argument;
}

在大多数情况下,需要强制转换以避免编译器警告,但当 T = U 时,强制转换是多余的。或者是否有更好的实现方式?

最佳答案

根据评论中 Oded 的提示,我在 gcc-4.7.2 和 MVSC-2012 中进行了测试:

template <typename U, typename T>
void assign1(const T& t, U &u)
{
u = (U) t; // CAST
}

template <typename U, typename T>
void assign2(const T& t, U &u)
{
u = t; // WITHOUT CAST
}

int main()
{
{
int t = 12;
int u = 1;
assign1(t, u);
}
{
int t = 12;
int u = 1;
assign2(t, u);
}
}

assign1 汇编代码(gcc):

!{
! u = (U) t;
assign1<int, int>(int const&, int&)+3: mov 0x8(%ebp),%eax
assign1<int, int>(int const&, int&)+6: mov (%eax),%edx
assign1<int, int>(int const&, int&)+8: mov 0xc(%ebp),%eax
assign1<int, int>(int const&, int&)+11: mov %edx,(%eax)
!}

assign2 汇编代码(gcc):

!{
! u = t;
assign2<int, int>(int const&, int&)+3: mov 0x8(%ebp),%eax
assign2<int, int>(int const&, int&)+6: mov (%eax),%edx
assign2<int, int>(int const&, int&)+8: mov 0xc(%ebp),%eax
assign2<int, int>(int const&, int&)+11: mov %edx,(%eax)
!}

它们在 gcc 中是相同的。

assign1 汇编代码(MSVC):

001413EE  mov         eax,dword ptr [u]  
001413F1 mov ecx,dword ptr [t]
001413F4 mov edx,dword ptr [ecx]
001413F6 mov dword ptr [eax],edx

assign2 汇编代码(MSVC):

0014142E  mov         eax,dword ptr [u]  
00141431 mov ecx,dword ptr [t]
00141434 mov edx,dword ptr [ecx]
00141436 mov dword ptr [eax],edx

它们在 MSVC 中也是一样的。

因此,两个编译器都忽略了转换。

关于c++ - VS 是否将转换优化为相同类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15731161/

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