德尔菲相当于C++的记忆集吗?
What is the Delphi equivalent to C++'s memset?
sz是一个char数组吗?缓冲区中的memset指向什么?如何将下面的C++代码转换为Delphi?
int data = _ttoi(m_Strtag.GetBuffer(0));
unsigned char sz[4];
memset(sz,0, 4);
sz[0] = (unsigned char)((data >> 24) & 0xFF);
sz[1] = (unsigned char)((data >> 16) & 0xFF);
sz[2] = (unsigned char)((data >> 8) & 0xFF);
sz[3] = (unsigned char)(data & 0xFF);
这是delphi调用:如果SAAT_YTagSelect(hp,isenable,1,sz,4),则。。。
用于以下delphi函数:
function SAAT_YTagSelect(pHandle: Pointer; nOpEnable1, nMatchType: Byte; MatchData: PByte; nLenth: Byte): Boolean; stdcall;
等效于memset
的是FillChar,它用字节值填充一个字节范围。
由于数组sz
中的所有字节都是在data
的字节顺序颠倒时设置的,因此可以删除这一行。
字节反转可以稍微简化一点(用类型限制代替and $FF
):
data := StrToInt(aString);
sz[0] := Byte(data shr 24);
sz[1] := Byte(data shr 16);
sz[2] := Byte(data shr 8);
sz[3] := Byte(data);
通过用Byte()
封装赋值,编译器被告知跳过范围检查。对生成的汇编代码(启用范围检查)进行比较后发现,这也产生了一个更有效的代码:
Project1.dpr.36: sz[0] := Byte(data shr 24);
0041C485 A1BC3E4200 mov eax,[$00423ebc]
0041C48A C1E818 shr eax,$18
0041C48D A2C03E4200 mov [$00423ec0],al
Project1.dpr.40: sz[0] := (data shr 24) and $FF;
0041C485 A1BC3E4200 mov eax,[$00423ebc]
0041C48A C1E818 shr eax,$18
0041C48D 25FF000000 and eax,$000000ff
0041C492 3DFF000000 cmp eax,$000000ff
0041C497 7605 jbe $0041c49e
0041C499 E8F290FEFF call @BoundErr
0041C49E A2C03E4200 mov [$00423ec0],al
一种更直接的填充sz数组的方法,不需要移位例程:
sz[0] := PByte(@data)[3];
sz[1] := PByte(@data)[2];
sz[2] := PByte(@data)[1];
sz[3] := PByte(@data)[0];
相关文章:
- 松弛原子与无同步情况下的记忆连贯性
- 递归函数有效,但无法记忆
- 如何将记忆应用于此递归函数?
- 共享记忆:让我们谈谈它的特殊性
- 为什么nlohmann不释放记忆
- CPP 中的瓦尔格林德和记忆泄漏:"Conditional jump or move depends on uninitialised values"
- C++17 多态记忆资源不起作用
- 我是否漏了记忆?
- 关于记忆后这种递归关系的时间复杂度
- 记忆栅栏和记忆屏障是一样的吗
- 使用记忆在 C++ 中实现 Knapstack
- 无论如何可以将webm / mp4文件编译/记忆为.exe程序吗?(C++)
- 如何在硬币兑换中添加记忆
- 动态记忆的删除是如何真正起作用的
- C++遗传,记忆问题
- 使用未声明的标识符"nothrow";你是说"扔"吗?记忆
- Qt驱动器下拉列表仅列出USB记忆棒
- 我找不到瓦尔格林德告诉我的记忆链接
- DFS + 记忆解决方案在 LeetCode 上获取 TLE
- 根据呼叫位置进行记忆