草庐IT

c++ - cdecl 调用约定如何破坏 ESP?

我的应用程序崩溃了,因为我调用的库函数更改了ESP,尽管它被声明为cdecl。库(libclang.dll)是使用MinGW编译的,我在VC++项目中使用它。这些函数作为C函数导出,DependencyWalker告诉我它们具有正确的cdecl调用约定。通过包含Clang的“index.h”文件,使用dllimport将函数导入到我的项目中。似乎并不是所有函数都破坏了ESP,因此一些函数执行成功,其他函数导致崩溃。这是一个工作函数的集合://calltoclang_getNumDiagnostics(TU);-works!5AF3EFABmovesi,esp5AF3EFADmoveax

c++ - 内联汇编会影响可移植性吗?

假设您编写了可在不同平台上流畅运行的可移植C++代码。要进行一些修改以优化性能,您可以在代码中使用内联汇编。这是一个好的做法(搁置编译器优化)还是会给可移植性带来麻烦? 最佳答案 显然它破坏了可移植性——代码只能在汇编语言所针对的特定体系结构上工作。此外,这通常是浪费时间-编译器的优化器几乎肯定比您更擅长编写汇编代码。 关于c++-内联汇编会影响可移植性吗?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.c

c++ - 使用 > 2GB 内存时,Cygwin g++ x86_64 段错误(核心已转储)

我用C++编写了一个素数筛选程序,它使用~12GB内存来计算低于100,000,000,000(1000亿)的所有素数。该程序在使用VisualStudio2012(在为x64设置的项目中)以及64位Linux上的g++编译时运行良好。但是,当在Windows7HomePremium64位上使用cygwin64中的g++编译时,当尝试使用超过~2GBram(运行筛子>~17,000,000,000)时会发生段错误我相当确定它作为64位进程运行,因为任务管理器中的进程名称旁边没有*32。代码:#include#include#include#includeusingnamespacest

c++ - 以最便宜/最少侵入的方式自动更新一点?

以原子方式更新单个位(从std::bitset)的最便宜的技术是什么?我不认为x86BTR是原子的。我想知道我是否必须读取最近的字节然后使用CAS?如果LOCK+BTR是最快的解决方案,我很乐意接受内联的x86-64汇编答案。 最佳答案 BTS/BTR默认不是原子的,但是可以带LOCK前缀。这是我对原子位设置和原子位重置的实现,它适用于Intel64位和32位平台(适用于MSVC、gcc和可能的clang)。ARM的实现也可以从:http://alice.loria.fr/software/geogram/doc/html/atom

c++ - 如何在C语言中检测环绕计数器和大负值之间的区别

为我的愚蠢道歉,因为这是我在这个论坛上的第一篇文章。我试图在以下代码的帮助下检测环绕无符号32位计数器和大型负跳转之间的区别,但编译器给我错误:错误:由于数据类型的范围有限,比较始终为真[-Werror=type-limits]这是我的代码片段:#defineMAX_BACKWARD_JUMP-4294959295//UINT_MAX-8000#defineMIN_BACKWARD_JUMP-3600#defineMAX_FORWARD_JUMP4800000signedintrtpDelta;//Signed32-bitunsignedintcurrRTPTs,prevRTPTs;/

c++ - XOR AL,AL + MOVZX EAX, AL 比 XOR EAX,EAX 有什么优势?

我有一些未知的C++代码是在发布版本中编译的,因此对其进行了优化。我正在努力解决的问题是:xoral,aladdesp,8cmpbyteptr[ebp+userinput],31hmovzxeax,al这是我的理解:xoral,al;seteaxto0x??????00(clearlastbyte)addesp,8;forsomeunclearreason,setthestackpointerhighercmpbyteptr[ebp+userinput],31h;setzeroflagifuserinputwas"1"movzxeax,al;seteaxtoALandextendwit

c++ - 在位掩码中选择与选择器位图中的 1 位重叠的设置位跨度

给定:一个位掩码a(例如,std::uint64_t),其中至少包含一组(1)位。选择器位掩码b是a的子集(即a&b==b),并且至少有一位设置。我想在a中选择与b中的位重叠的连续1位的跨度:a=0b1111001110001100;b=0b0000001010001000;//c=0b0000001110001100//XXXXYYYZZXXXX组在c中为0,因为b&XXXX为false。ZZ组被复制,因为b设置了Z位之一。同样的原因,YYY组也在c中设置。请注意,b可以在a的单个组中设置多个位。因此对于a中每个连续的1组,如果b,则将所有这些位设置在c中>在任何这些位置都有一个1。

c++ - 检测系统是否可以运行amd64可执行文件

我已将我的应用程序编译为使用x86指令集,但我需要以编程方式知道运行可执行文件的机器是否支持amd64指令集。有没有一种简单的方法可以找出这一点(可能使用CPUID)?应用程序需要能够在多个操作系统上运行,因此首选基于非操作系统的方法。 最佳答案 您正在寻找代码来检测Longmode.AbitintheCPUIDextendedattributesfieldinformsprogramsinrealorprotectedmodesiftheprocessorcangotolongmode,whichallowsaprogramtod

c++ - 如何使用 SVML 说明

这个问题在这里已经有了答案:C++error:‘_mm_sin_ps’wasnotdeclaredinthisscope(3个答案)WhereisClang's'_mm256_pow_ps'intrinsic?(1个回答)关闭5年前。我正在尝试使用SIMD计算exponential函数。我发现了这个功能:https://software.intel.com/sites/landingpage/IntrinsicsGuide/#text=_mm_exp_ps&expand=2136我已经在我的代码中包含了"immintrin.h",我的cpu也有一个SSE标志。但是gcc提示error:

c++ - 海湾合作委员会 assembly "+t"

我目前正在旧编译器(大约2004年的GCC)上测试C++中的一些内联汇编,我想对float执行平方根函数。在尝试和搜索成功的方法后,我遇到了以下代码floatr3(floatn){__asm__("fsqrt":"+t"(n));returnn;};有效。问题是,即使我理解所使用的汇编指令,我也无法找到关于"+t"标志在n变量上的含义的任何特定文档.我的真实想法是,这似乎是一种将变量n视为输入和输出变量的方式,但我无法找到有关它的任何信息。那么,“t”标志到底是什么,它在这里是如何工作的? 最佳答案 +Meansthatthisop