这是用软件编写的测试和设置:
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中使用不支持硬件级别的测试和设置的机制吗?如果是这样,原子性如何得到保证?
关于如何在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 int和long是4,以及short是2.
假设没有填充.
那么怎样的布局10 bytes的struct呢?
它取决于字节顺序吗?
会是这样的:
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)
我想手动用数据填充这个数组,然后memcpy到struct.
我应该做[1]:
buffer[0] = 0x12345678 & 0xFF;
buffer[1] …Run Code Online (Sandbox Code Playgroud) 在以下(合法)c代码中,没有明确分配给指针p的内存.
AFAIK,我无法在没有明确分配内存的情况下int *p指向一个值5.
int main()
{
char *p;
p = "Hello";
return 0;
}
Run Code Online (Sandbox Code Playgroud)
char*指针不同"Hello"以下行
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)
另外:无论如何,使用后者是不是更好的做法?
我尝试使用我写的按位运算来比较算术加法和函数 - 发现后者几乎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) libc关于变参函数,这是要说的:
由于原型没有为可选参数指定类型,因此在对可变参数函数的调用中,默认参数提升是对可选参数值执行的。这意味着将char或short int类型的对象(无论是否带符号)提升为int或unsigned int;并且将float类型的对象提升为double类型。因此,如果调用方将char作为可选参数传递,它将被提升为int
那么,为什么会有人使用"%c",或"%hd"在printf的?他们应该只使用"%d"。
我还看到没有的格式说明符float。float必须与之%f共存,double因为由于晋升,不可能接受浮夸作为可变参数。
我知道scanf,参数是指针,并且没有提升。
我是否有任何理由想念为什么以及何时"%c"必须存在printfs?