问题标签 [memcmp]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
164 浏览

c - 如何防止 Atmel Studio gcc 6.3.1 将 4 字节 memcmp() 优化为 4 字节直接比较?

运行 Atmel Studio 及其提供的 gcc 6.3.1 为 Atmel/Microchip SAMV70 (ARM Cortex-M7) 芯片构建固件。我有使用 . 将 4 字节输入数组与 4 字节本地数组进行比较的代码memcmp()。当编译-O0为禁用优化时,它可以正常工作。当编译-Os为优化大小或使用-O3最大优化时,编译器将memcmp()调用替换为直接的 4 字节比较(通过检查反汇编进行验证)。不幸的是,优化有时还会将本地 4 字节数组移动到未对齐的起始地址,因此虽然可以正常工作,但由于未对齐访问 memcmp(),直接比较会触发 a 。HardFault

在我看来,这是 100% 的编译器优化错误(可能是 gcc,可能是 Atmel 添加的),但我坚持使用提供的编译器,因此无法选择更新。所以这是我的实际问题:有没有办法保持优化启用但禁用此特定优化?否则,我会被迫强制本地 4 字节数组对齐 4 字节或寻找其他解决方法。

编译器版本: gcc version 6.3.1 20170620 (release) [ARM/embedded-6-branch revision 249437] (Atmel build: 508)

这是一个可能触发故障的示例函数:

我的代码总是以 4 字节对齐的方式传递,input_data所以这不是问题,但编译器优化再一次认为这是理所当然的,这是一种不好的形式。

0 投票
3 回答
87 浏览

c++ - 8 个后续字节的测试不会转换为单个比较指令

这个问题的启发,我比较了三个不同的函数来检查参数指向的 8 个字节是否为零(请注意,在原始问题中,字符与 比较'0',而不是0):

虽然我希望启用优化后的汇编结果相同,但只有memcmp版本被翻译成 x64 上的单个cmp指令。两者f1f2都被翻译成缠绕或未缠绕的循环。此外,这适用于所有 GCC、Clang 和 Intel 编译器-O3

f1有什么理由f2不能优化成一条比较指令吗?对我来说,这似乎是一个非常简单的优化。

现场演示:https ://godbolt.org/z/j48366

0 投票
0 回答
17 浏览

c++ - static_assert 失败:结构的大小与所有属性的大小之和不同

我是 C++ 语言的新手,我正在编写一个数据结构,用于序列化/反序列化保存在本地机器上的数据。代码数据结构如下所示:

但是,此代码无法编译,因为静态断言失败并出现以下错误:

但我不太明白为什么会这样。我的数据结构中有一个浮点数、两个整数和两个 time_t,所以这个结构的大小应该与“(sizeof(float) + 2 * sizeof(int) + 2 * sizeof(time_t)”相同

此外,当我将 static_assert 更改为下面的代码时,它以某种方式起作用:

有人可以让我知道为什么会这样吗?

最好的

0 投票
1 回答
176 浏览

c - 准确识别 memcmp 失败的位置

标题是不言自明的,我正在比较两个应该相同但失败的内存块。我不知道测试失败的地方。找出这一点将帮助我调试问题。那么有没有办法准确地找到 memcmp 失败的地方?

0 投票
3 回答
338 浏览

c - 用 memcmp() 比较整数

我正在制作一个函数来获取每个大小为 SIZ 的 NMEMB 成员数组的最大值,并将每个成员与memcmp(). 问题是在比较有符号整数时,结果是不正确的,但同时是正确的。这是一个例子:

  • hexdump()只是一个调试功能,不会改变程序。

编译执行时输出如下:

这是正确的,因为memcmp()比较一个字节字符串并且不关心类型或符号,所以-11 = 0xfffffff5数组中的最大字节字符串是,v[]但同时不正确,因为-11它不是数组中的最大整数。

有没有办法使用这个函数获取数组的最大整数?

0 投票
3 回答
215 浏览

c - memcmp 究竟返回了什么?

我正在尝试创建自己的memcmp文件,但是每当我将它与原始memcmp函数进行比较时,相等的字符串都会返回零,但如果字符串不相等,则返回值是不同的。

memcmp与实际功能相比的输出是

./a.out "ajinkya" "akinkya"

MEMCMP:-256

SST_MEMCMP:-1

0 投票
1 回答
99 浏览

c - 比较两个双打,看看它们是否相同 NaN

我有两个双打并且x已知是一个特定的 NaN 值,我想看看它们是否按位相同。也就是说,我想确定是否与 NaN 值完全相同。yyxy

NaN 不能与操作符进行有用的比较,==因为 NaN 永远不等于任何其他值(甚至不等于它们自己!)。

有没有比以下“按位相等”方法更好的方法(这种方法合法吗?):

0 投票
1 回答
78 浏览

c - Why memcmp return int

I read about int vs size_t vs ssize_t , and I understand that int and ssize_t is signed while size_t is unsigned.

Why memcmp return int and no return ssize_t like recv return ssize_t?

0 投票
0 回答
13 浏览

gcc - char16_t 的 gcc 10.3 和 gcc 11.1 之间的 memcmp 差异

我正在转换一些使用 memcmp 函数但没有得到预期输出的测试。现在我一直在试图弄清楚为什么 windows 和 linux 的输出存在差异,最后我找到了godbolt.orgx86-64 gcc 10.3在那里我玩弄了不同的 gcc 版本,令我惊讶的是和之间存在差异x86-64 gcc 11.1。你能帮我弄清楚正确的输出是什么吗?

使用的代码:

Gcc 10.3 输出

Gcc 11.1 输出

VS 2019 / MSVC 14.29.30133 输出

在这个例子中,MSVC 看起来总是准确地返回 1。对于 gcc,有时情况并非如此,因为它似乎会返回差异。所以介于83'S'and78'N'是 5 所以返回。现在我的问题是,这是正确的输出还是在这种情况下应该只是“1”来表示存在差异并且 ptr1 高于 ptr2?我查看了一些文档,但对于它应该是什么有点模糊。