小编Arj*_*ran的帖子

可以在没有硬件支持的软件中实现测试和设置吗?

这是用软件编写的测试和设置:

boolean TestAndSet(boolean *target) {
    boolean rv = *target;
    *target = TRUE;
    return rv;
}
Run Code Online (Sandbox Code Playgroud)

do {
    while(TestAndSetLock(&lock))
        ; // do nothing
        // critical section
    lock = FALSE;
        // remainder section
} while(TRUE);
Run Code Online (Sandbox Code Playgroud)

我们可以在CPU中使用不支持硬件级别的测试和设置的机制吗?如果是这样,原子性如何得到保证?

c synchronization operating-system mutual-exclusion

7
推荐指数
1
解决办法
2765
查看次数

struct中的字节顺序

关于如何在a中排序字节,我有点困惑struct.

假设我有以下结构:

struct container {
    int myint;
    short myshort;
    long mylong;
};
Run Code Online (Sandbox Code Playgroud)

现在,我想初始化一个类型的变量,struct container就像下面这样,除了我用数组做.

struct container container1 = {.myint = 0x12345678,
                               .myshort = 0xABCD,
                               .mylong = 0x12345678};
Run Code Online (Sandbox Code Playgroud)

假设sizeof intlong4,以及short2.

假设没有填充.

那么怎样的布局10 bytesstruct呢?

它取决于字节顺序吗?

会是这样的:

0x12345678 ABCD 12345678
Run Code Online (Sandbox Code Playgroud)

或者喜欢:

0x78563412 CDAB 78563412
Run Code Online (Sandbox Code Playgroud)

我想要做的是:我有以下char数组:

char buffer[10] = {0};
Run Code Online (Sandbox Code Playgroud)

我想手动用数据填充这个数组,然后memcpystruct.

我应该做[1]:

buffer[0] = 0x12345678 & 0xFF;
buffer[1] …
Run Code Online (Sandbox Code Playgroud)

c memory arrays struct pointers

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

内存分配如何在没有显式分配的情况下为char*工作

在以下(合法)c代码中,没有明确分配给指针p的内存.

AFAIK,我无法在没有明确分配内存的情况下int *p指向一个值5.

int main()
{
    char *p;
    p = "Hello";
    return 0;
}
Run Code Online (Sandbox Code Playgroud)
  • 如何char*指针不同
  • 分配给的内存在哪里 "Hello"

c pointers

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

为什么char*s ="string"在不是const时不显示错误或警告

以下行

char *s = "string";
Run Code Online (Sandbox Code Playgroud)

gcc即使有,也不会抛出任何警告/错误-Wall.

AFAIK,指针s直接指向某些部分.rodata,使其成为指向a的指针const char.

那么,为什么指针不抱怨并期望:

const char *s = "string";
Run Code Online (Sandbox Code Playgroud)

另外:无论如何,使用后者是不是更好的做法?

c pointers const

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

为什么在此代码中使用按位运算符的加法比算术加法慢得多

我尝试使用我写的按位运算来比较算术加法和函数 - 发现后者几乎10x慢了.这种速度差异的原因是什么?由于我在循环中添加相同的数字,编译器是否会在第一种情况下将其重写为更优的东西?

使用算术运算:

int main()
{
    clock_t begin = clock();
    int x;
    int i = 1000000000;
    while(i--) {
    x = 1147483000 + i;
    }
    printf("%d\n", x);

    clock_t end = clock();
    double time_spent = (double)(end - begin) / CLOCKS_PER_SEC;

    printf("time spent = %f\n", time_spent);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

输出:

1147483000
time spent = 3.520000
Run Code Online (Sandbox Code Playgroud)

使用按位运算符:

内线while loop被替换为:

x = add(1147483000, i);
Run Code Online (Sandbox Code Playgroud)

这是add功能:

int add(int x, int y) {
    while(y != 0) {
        int carry = …
Run Code Online (Sandbox Code Playgroud)

c bit-manipulation bitwise-operators compiler-optimization

1
推荐指数
2
解决办法
344
查看次数

默认参数提升和printf中“%c”的相关性

libc关于变参函数,这是要说的:

由于原型没有为可选参数指定类型,因此在对可变参数函数的调用中,默认参数提升是对可选参数值执行的。这意味着将char或short int类型的对象(无论是否带符号)提升为int或unsigned int;并且将float类型的对象提升为double类型。因此,如果调用方将char作为可选参数传递,它将被提升为int

那么,为什么会有人使用"%c",或"%hd"在printf的?他们应该只使用"%d"

我还看到没有的格式说明符floatfloat必须与之%f共存,double因为由于晋升,不可能接受浮夸作为可变参数。

我知道scanf,参数是指针,并且没有提升。

我是否有任何理由想念为什么以及何时"%c"必须存在printfs?

c printf variadic-functions

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