VS2015中奇怪的memcpy_s行为

时间:2017-01-16 15:31:40

标签: c++ visual-c++ assembly visual-studio-2015 memcpy

最近我正在分析一个应用程序,我注意到memcpy_s程序集实现的行为很奇怪。 我正在谈论驻留在Microsoft Visual Studio 14.0 \ VC \ crt \ src \ i386 \ memcpy.asm中的实现 我到达CopyUpLargeMov:然后我希望它选择SSE2路径,或者使用任何其他可用的优化实现。 代码如下:

import tkinter as tk
from PIL import Image, ImageTk

class App(tk.Tk):
    def __init__(self):
        tk.Tk.__init__(self) # create window
        # load initial image
        self.img = ImageTk.PhotoImage(Image.open("path/to/image"))
        # display it in a label
        self.label = tk.Label(self, image=self.img)
        self.label.pack(fill='both', expand=True)

        tk.Button(self, text="Update", command=self.update_image).pack()

        self.mainloop()

    def update_image(self):
        # code to capture new image here
        # ...
        # load new image
        self.img = ImageTk.PhotoImage(Image.open("path/to/image"))
        # update label image
        self.label.configure(image=self.img)

if __name__ == '__main__':
    App()

无论我如何处理优化调整,它都不会达到 CopyUpLargeMov: bt __favor, __FAVOR_ENFSTRG ; check if Enhanced Fast Strings is supported jnc CopyUpSSE2Check ; if not, check for SSE2 support rep movsb mov eax,[esp + 0Ch] ; return original destination pointer pop esi pop edi M_EXIT
使用Release | Win32,VS2015 Upd3,Windows10 x64进行测试。

实际的C ++代码

CopyUpSSE2Check

有什么想法吗?

EDIT001:
看来x64没有表现出奇怪的行为,它属于增强快速字符串优化部分的代码。也许上面的x86限制?

1 个答案:

答案 0 :(得分:1)

正如@EOF在评论中指出的那样,rep movsb 优化。它将数据从字符串移动到字符串,所谓的“#34;增强的快速字符串"优化。所以我只是忽略了它,memcpy正在按预期工作。