UE4 我的bug——模板函数

Posted cartzhang

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了UE4 我的bug——模板函数相关的知识,希望对你有一定的参考价值。

一、模板函数造成的Bug

之前,自己写了一个很深的bug,与编译器有关。
写了一个模板函数在某个CPP文件中,然后就出现玩家不能正常落地,落地后总有一段距离。
Template
bool InvalideateOrUpdateCapsuleBodySetup(…)

在VS2015下可以出现这个问题,在Vs2017下则没有。
在编辑器模式下没有问题,在打包后会出现此bug.

最后发现了是在项目CPP文件中,写了一个与引擎同名的模板函数,在编辑器下模式和vS2017下,均可以找到对应的虽然名字一样,调用还是正常的。

在VS2015下,则不会正常,引擎的内部调用函数,会调用我写的CPP里面的同名模板函数。

来看看GCC编译过程。

二、GCC编译过程。

![aa](E:\\blog\\UE\\UE 模板函数\\编译过程.png)

    call    __Z6myswapIcEvRT_S1_ //77 ===>155
    ...
    
LFE1024:
    .section    .text$_Z6myswapIcEvRT_S1_,"x"
    .linkonce discard
    // gloal define here.定义全局标识。
    .globl  __Z6myswapIcEvRT_S1_
    .def    __Z6myswapIcEvRT_S1_;   .scl    2;  .type   32; .endef
__Z6myswapIcEvRT_S1_: //155
LFB1025:
    .cfi_startproc
    pushl   %ebp
    .cfi_def_cfa_offset 8
    .cfi_offset 5, -8
    movl    %esp, %ebp
    .cfi_def_cfa_register 5
    subl    $16, %esp
    movl    8(%ebp), %eax
    movzbl  (%eax), %eax
    movb    %al, -1(%ebp)
    movl    12(%ebp), %eax
    movzbl  (%eax), %edx
    movl    8(%ebp), %eax
    movb    %dl, (%eax)
    movl    12(%ebp), %eax
    movzbl  -1(%ebp), %edx
    movb    %dl, (%eax)
    leave
    .cfi_restore 5
    .cfi_def_cfa 4, 4
    ret
    .cfi_endproc

三、函数模板机制结论

1.编译器并不是把函数模板处理成能够处理任意类的函数

2.编译器从函数模板通过具体类型产生不同的函数

3.编译器会对函数模板进行两次编译。在声明的地方对模板代码本身进行编译;在调用的地方对参数替换后的代码进行编译。

四、找到原因

模板函数的编译:
C++的编译器在遇到一个函数模板的时候,它首先要做的是确定该函数的参数,这就叫做把一个函数模板修改成一个具有具体参数的函数。这种方法一般而言是隐式转换的,我们一般是看不见的,但是C++也提供了一种显示转换的方法。

在整体包中,VS2015把所有的模板函数编译,然后生程一个可重定位的二进制程序,然后根据函数名来调用,并没有作用域的概念,而一个Global d的名称标识。编译器只是为函数的实现,提供了一种可能的解决方案,并没有显示指定函数。

五、 总结一下

以后需要给每个对象给出一个项目相关的前缀或后缀,从根本上避免模式函重名。

在普通函数也尽量给出一个作用域。

参考:

【1】https://www.cnblogs.com/uniqueliu/archive/2011/08/11/2134745.html

【2】https://www.cnblogs.com/gd-luojialin/p/9750180.html

以上是关于UE4 我的bug——模板函数的主要内容,如果未能解决你的问题,请参考以下文章

ue编辑器能用打包用不了

UE4 C++BUG --- 细节面板不会显示内容

ue4 c++ 模板中的一个小技巧

ue4 c++ 模板中的一个小技巧

UE4网络之(二) 远程调用函数(RPC)

[UE4]控件模板