小编lin*_*xer的帖子

为什么整数提升的结果不同?

请看我的测试代码:

#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)

c integer

15
推荐指数
1
解决办法
1880
查看次数

是否有必要在softirq上下文中调用rcu_read_lock

rcu_read_lock的实现是禁用抢占和屏障。并且softirq上下文将不会被抢占。因此有必要在softirq上下文中调用rcu_read_lock。障碍重要吗?

linux kernel rcu

5
推荐指数
1
解决办法
1670
查看次数

为什么结果是unsigned int(1)的"2" - unsigned int(0xFFFFFFFF)

请查看以下代码:

#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".这是我期待的.

c

4
推荐指数
1
解决办法
2450
查看次数

为什么glibc中strcpy的性能更差?

我正在阅读源代码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)

c performance glibc

3
推荐指数
1
解决办法
2821
查看次数

标签 统计

c ×3

glibc ×1

integer ×1

kernel ×1

linux ×1

performance ×1

rcu ×1