请看我的测试代码:
#include <stdlib.h>
#include <stdio.h>
#define PRINT_COMPARE_RESULT(a, b) \
if (a > b) { \
printf( #a " > " #b "\n"); \
} \
else if (a < b) { \
printf( #a " < " #b "\n"); \
} \
else { \
printf( #a " = " #b "\n" ); \
}
int main()
{
signed int a = -1;
unsigned int b = 2;
signed short c = -1;
unsigned short d = 2;
PRINT_COMPARE_RESULT(a,b);
PRINT_COMPARE_RESULT(c,d); …Run Code Online (Sandbox Code Playgroud) rcu_read_lock的实现是禁用抢占和屏障。并且softirq上下文将不会被抢占。因此有必要在softirq上下文中调用rcu_read_lock。障碍重要吗?
请查看以下代码:
#include <stdlib.h>
#include <stdio.h>
int main()
{
unsigned int a = 1;
unsigned int b = -1;
printf("0x%X\n", (a-b));
return 0;
}
Run Code Online (Sandbox Code Playgroud)
结果是0x2.
我认为整数提升不应该发生,因为"a"和"b"的类型都是unsigned int.但结果打败了我......我不知道原因.
顺便说一下,我知道算术结果应该是2,因为1 - ( - 1)= 2.但是b的类型是unsigned int.将(-1)赋值给b时,b的值实际上是0xFFFFFFFF.它是unsigned int的最大值.当一个小的无符号值减去一个大值时,结果不是我所期望的.
从下面的答案中,我认为溢出可能是一个很好的解释.现在我写了其他测试代码.它证明了溢出的答案是正确的.
#include <stdlib.h>
#include <stdio.h>
int main()
{
unsigned int c = 1;
unsigned int d = -1;
printf("0x%llx\n", (unsigned long long)c-(unsigned long long)d);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
结果是"0xffffffff00000002".这是我期待的.
我正在阅读源代码glibc2.9.阅读该strcpy函数的源代码,性能不如我预期的那么好.
以下是strcpyin 的源代码glibc2.9:
char * strcpy (char *dest, const char* src)
{
reg_char c;
char *__unbounded s = (char *__unbounded) CHECK_BOUNDS_LOW (src);
const ptrdiff_t off = CHECK_BOUNDS_LOW (dest) - s - 1;
size_t n;
do {
c = *s++;
s[off] = c;
}
while (c != '\0');
n = s - src;
(void) CHECK_BOUNDS_HIGH (src + n);
(void) CHECK_BOUNDS_HIGH (dest + n);
return dest;
}
Run Code Online (Sandbox Code Playgroud)
因为我不知道使用偏移量的原因,所以我通过将上面的代码与以下代码进行比较来进行一些性能测试:
char* my_strcpy(char *dest, const char *src) …Run Code Online (Sandbox Code Playgroud)