草庐IT

ASSEMBLY

全部标签

c++ - 为什么树向量化会使这种排序算法慢2倍?

如果在gcc(4.7.2)中启用了-fprofile-arcs,则thisquestion的排序算法将变得更快(!)两倍。这个问题经过高度简化的C代码(事实证明,我可以使用全零来初始化数组,但仍存在怪异的性能行为,但这使推理变得简单得多):#include#include#defineELEMENTS100000intmain(){inta[ELEMENTS]={0};clock_tstart=clock();for(inti=0;i长时间使用优化标志后,事实证明-ftree-vectorize也会产生这种怪异的行为,因此我们可以将-fprofile-arcs排除在问题之外。用perf

c++ - 为什么树向量化会使这种排序算法慢2倍?

如果在gcc(4.7.2)中启用了-fprofile-arcs,则thisquestion的排序算法将变得更快(!)两倍。这个问题经过高度简化的C代码(事实证明,我可以使用全零来初始化数组,但仍存在怪异的性能行为,但这使推理变得简单得多):#include#include#defineELEMENTS100000intmain(){inta[ELEMENTS]={0};clock_tstart=clock();for(inti=0;i长时间使用优化标志后,事实证明-ftree-vectorize也会产生这种怪异的行为,因此我们可以将-fprofile-arcs排除在问题之外。用perf

c++ - 为什么我的程序集输出中有两个析构函数实现?

这个问题在这里已经有了答案:GNUGCC(g++):Whydoesitgeneratemultipledtors?(2个回答)关闭5年前.我的.o文件的objdump显示我有两个不同的析构函数用于同一个类。为什么?Disassemblyofsection.text._ZN1AD0Ev:0000000000000000:0:53push%rbx1:be00000000mov$0x0,%esi6:4889fbmov%rdi,%rbx9:48c70700000000movq$0x0,(%rdi)10:ba2c000000mov$0x2c,%edx15:bf00000000mov$0x0,%e

c++ - 为什么我的程序集输出中有两个析构函数实现?

这个问题在这里已经有了答案:GNUGCC(g++):Whydoesitgeneratemultipledtors?(2个回答)关闭5年前.我的.o文件的objdump显示我有两个不同的析构函数用于同一个类。为什么?Disassemblyofsection.text._ZN1AD0Ev:0000000000000000:0:53push%rbx1:be00000000mov$0x0,%esi6:4889fbmov%rdi,%rbx9:48c70700000000movq$0x0,(%rdi)10:ba2c000000mov$0x2c,%edx15:bf00000000mov$0x0,%e

windows - x64 程序集中的 'shadow space' 是什么?

我找到了很多关于这个影子空间的话题,但我都找不到答案,所以我的问题是:在进入过程之前,我需要从堆栈指针中减去多少字节?我应该在减去“影子空间”之前将过程参数压入堆栈吗?我已经反汇编了我的代码,但我找不到逻辑。 最佳答案 影子空间(有时也称为溢出空间或主空间)比被调用函数拥有的返回地址高32个字节(并且可以用作暂存空间),如果有的话,在堆栈参数下方。调用者必须在运行call指令之前为其被调用者的影子空间保留空间。它的目的是让调试x64更容易。回想一下first4parametersarepassedinregisters.如果您闯入调

windows - x64 程序集中的 'shadow space' 是什么?

我找到了很多关于这个影子空间的话题,但我都找不到答案,所以我的问题是:在进入过程之前,我需要从堆栈指针中减去多少字节?我应该在减去“影子空间”之前将过程参数压入堆栈吗?我已经反汇编了我的代码,但我找不到逻辑。 最佳答案 影子空间(有时也称为溢出空间或主空间)比被调用函数拥有的返回地址高32个字节(并且可以用作暂存空间),如果有的话,在堆栈参数下方。调用者必须在运行call指令之前为其被调用者的影子空间保留空间。它的目的是让调试x64更容易。回想一下first4parametersarepassedinregisters.如果您闯入调

c++ - C 和 C++ 标准库是用什么语言编写的?

C和C++本身实际上无法做任何事情,它们需要库才能工作。那么这些库是如何创建的呢?汇编语言? 最佳答案 C和C++库几乎普遍使用C和C++编写,C和C++编译器也是如此。其实很多编译器甚至都用来自己编译!这怎么可能?好吧,显然第一个C编译器最初不可能是用C开发的。但是,一旦存在C编译器,就可以使用它来编译另一个编译器。随着编译器的开发,源代码也在开发中。可以同时开发两者。由于大多数编译器都是对其前辈的改进,因此它们通常用于编译更好的版本!但是,就库而言,这很容易:C可以实际做一些事情。虽然一些较低级别的例程可以用汇编程序编写,但绝大

c++ - C 和 C++ 标准库是用什么语言编写的?

C和C++本身实际上无法做任何事情,它们需要库才能工作。那么这些库是如何创建的呢?汇编语言? 最佳答案 C和C++库几乎普遍使用C和C++编写,C和C++编译器也是如此。其实很多编译器甚至都用来自己编译!这怎么可能?好吧,显然第一个C编译器最初不可能是用C开发的。但是,一旦存在C编译器,就可以使用它来编译另一个编译器。随着编译器的开发,源代码也在开发中。可以同时开发两者。由于大多数编译器都是对其前辈的改进,因此它们通常用于编译更好的版本!但是,就库而言,这很容易:C可以实际做一些事情。虽然一些较低级别的例程可以用汇编程序编写,但绝大

c++ - 函数地址不是实际的代码地址

在VisualStudio2008(C++)中调试一些代码时,我注意到我的函数指针变量中的地址不是函数本身的实际地址。这是一个外部“C”函数。intmain(){void(*printaddr)(constchar*)=&print;//debugshowsprintaddr==0x013C1429}Address:0x013C4F10voidprint(){...}取函数地址的反汇编为:void(*printaddr)(constchar*)=&print;013C7465C745BC29143C01movdwordptr[printaddr],offsetprint(13C1429

c++ - 函数地址不是实际的代码地址

在VisualStudio2008(C++)中调试一些代码时,我注意到我的函数指针变量中的地址不是函数本身的实际地址。这是一个外部“C”函数。intmain(){void(*printaddr)(constchar*)=&print;//debugshowsprintaddr==0x013C1429}Address:0x013C4F10voidprint(){...}取函数地址的反汇编为:void(*printaddr)(constchar*)=&print;013C7465C745BC29143C01movdwordptr[printaddr],offsetprint(13C1429