Visual Studio 或 Visual C++ Express 的现代 (2008/2010) 咒语会在编译后的代码中生成 x86 MUL 指令(无符号乘法)吗?即使使用无符号类型,我似乎也找不到或设计出它们出现在编译代码中的示例。
如果 VS 不使用 MUL 编译,有什么理由吗?
最佳答案
imul(有符号)和 mul(无符号)都有一个单操作数形式,它执行 edx:eax = eax * src。即 32x32b => 64b 全乘(或 64x64b => 128b)。
186 added an imul dest(reg), src(reg/mem), immediate形式,386 增加了一个 imul r32, r/m32 形式,两者都只计算结果的下半部分。 (根据 NASM's appendix B,另见 x86 tag wiki)
当两个 32 位值相乘时,结果的最低有效 32 位是相同的,无论您认为这些值是有符号还是无符号。换句话说,有符号乘法和无符号乘法之间的区别只有在您查看结果的“上”一半时才会变得明显,即单操作数 imul/mul放入 edx 和两个或三个操作数 imul 无处可放。因此,imul 的多操作数形式可用于有符号和无符号值,英特尔也无需添加新形式的 mul。 (他们本可以将多操作数 mul 设为 imul 的同义词,但这会使反汇编输出与源代码不匹配。)
在 C 中,算术运算的结果与操作数具有相同的类型(在窄整数类型的整数提升之后)。如果你将两个 int 相乘,你会得到一个 int,而不是 long long:“上半部分”不会被保留。因此,C 编译器只需要 imul 提供的内容,并且由于 imul 比 mul 更易于使用,因此 C 编译器使用 imul 以避免需要 mov 指令来将数据输入/输出 eax。
作为第二步,由于 C 编译器大量使用 imul 的多操作数形式,英特尔和 AMD 投入精力使其尽可能快。它只写入一个输出寄存器,而不是 e/rdx:e/rax,因此 CPU 可以比单操作数形式更容易地优化它。这使得 imul 更具吸引力。
mul/imul 的单操作数形式在实现大数运算时很有用。在 C 中,在 32 位模式下,您应该通过将 unsigned long long 值相乘来获得一些 mul 调用。但是,根据编译器和操作系统的不同,这些 mul 操作码可能隐藏在某些专用函数中,因此您不一定会看到它们。在64位模式下,long long只有64位,不是128位,编译器会简单的使用imul。
关于c++ - 来自 VS 2008/2010 的 x86 MUL 指令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4039378/
在railstutorial中,作者为什么选择使用这个(代码list10.25):http://ruby.railstutorial.org/chapters/updating-showing-and-deleting-usersnamespace:dbdodesc"Filldatabasewithsampledata"task:populate=>:environmentdoRake::Task['db:reset'].invokeUser.create!(:name=>"ExampleUser",:email=>"example@railstutorial.org",:passwo
我的瘦服务器配置了nginx,我的ROR应用程序正在它们上运行。在我发布代码更新时运行thinrestart会给我的应用程序带来一些停机时间。我试图弄清楚如何优雅地重启正在运行的Thin实例,但找不到好的解决方案。有没有人能做到这一点? 最佳答案 #Restartjustthethinserverdescribedbythatconfigsudothin-C/etc/thin/mysite.ymlrestartNginx将继续运行并代理请求。如果您将Nginx设置为使用多个上游服务器,例如server{listen80;server
如何将send与+=一起使用?a=20;a.send"+=",10undefinedmethod`+='for20:Fixnuma=20;a+=10=>30 最佳答案 恐怕你不能。+=不是方法,而是语法糖。参见http://www.ruby-doc.org/docs/ProgrammingRuby/html/tut_expressions.html它说Incommonwithmanyotherlanguages,Rubyhasasyntacticshortcut:a=a+2maybewrittenasa+=2.你能做的最好的事情是:
我对如何计算通过{%assignvar=0%}赋值的变量加一完全感到困惑。这应该是最简单的任务。到目前为止,这是我尝试过的:{%assignamount=0%}{%forvariantinproduct.variants%}{%assignamount=amount+1%}{%endfor%}Amount:{{amount}}结果总是0。也许我忽略了一些明显的东西。也许有更好的方法。我想要存档的只是获取运行的迭代次数。 最佳答案 因为{{incrementamount}}将输出您的变量值并且不会影响{%assign%}定义的变量,我
在几个项目中,我希望有一个类似rakeserver的rake任务,它将通过任何需要的方式开始为该应用程序提供服务。这是一个示例:task:serverdo%x{bundleexecrackup-p1234}end这行得通,但是当我准备停止它时,按Ctrl+c并没有正常关闭;它中断了Rake任务本身,它说rakeaborted!并给出堆栈跟踪。在某些情况下,我必须执行Ctrl+c两次。我可能可以用Signal.trap写一些东西来更优雅地中断它。有没有更简单的方法? 最佳答案 trap('SIGINT'){puts"Yourmessa
我有一个数组数组,想将元素附加到子数组。+=做我想做的,但我想了解为什么push不做。我期望的行为(并与+=一起工作):b=Array.new(3,[])b[0]+=["apple"]b[1]+=["orange"]b[2]+=["frog"]b=>[["苹果"],["橙子"],["Frog"]]通过推送,我将推送的元素附加到每个子数组(为什么?):a=Array.new(3,[])a[0].push("apple")a[1].push("orange")a[2].push("frog")a=>[[“苹果”、“橙子”、“Frog”]、[“苹果”、“橙子”、“Frog”]、[“苹果”、“
给定一个元素和一个数组,Ruby#index方法返回元素在数组中的位置。我使用二进制搜索实现了我自己的索引方法,期望我的方法会优于内置方法。令我惊讶的是,内置的在实验中的运行速度大约是我的三倍。有Rubyist知道原因吗? 最佳答案 内置#indexisnotabinarysearch,这只是一个简单的迭代搜索。但是,它是用C而不是Ruby实现的,因此自然可以快几个数量级。 关于Ruby#index方法VS二进制搜索,我们在StackOverflow上找到一个类似的问题:
有没有办法让Ruby能够做这样的事情?classPlane@moved=0@x=0defx+=(v)#thisiserror@x+=v@moved+=1enddefto_s"moved#{@moved}times,currentxis#{@x}"endendplane=Plane.newplane.x+=5plane.x+=10putsplane.to_s#moved2times,currentxis15 最佳答案 您不能在Ruby中覆盖复合赋值运算符。任务在内部处理。您应该覆盖+,而不是+=。plane.a+=b与plane.a=
我的ruby脚本从命令行参数获取某些输入。它检查是否缺少任何命令行参数,然后提示用户输入。但是我无法使用gets从用户那里获得输入。示例代码:test.rbname=""ARGV.eachdo|a|ifa.include?('-n')name=aputs"Argument:#{a}"endendifname==""puts"entername:"name=getsputsnameend运行脚本:rubytest.rbraghav-k错误结果:test.rb:6:in`gets':Nosuchfileordirectory-raghav-k(Errno::ENOENT)fromtes
出于某种原因,heroku尝试要求dm-sqlite-adapter,即使它应该在这里使用Postgres。请注意,这发生在我打开任何URL时-而不是在gitpush本身期间。我构建了一个默认的Facebook应用程序。gem文件:source:gemcuttergem"foreman"gem"sinatra"gem"mogli"gem"json"gem"httparty"gem"thin"gem"data_mapper"gem"heroku"group:productiondogem"pg"gem"dm-postgres-adapter"endgroup:development,:t