我写了两个程序,一个 (p1.cpp) 每 1 秒打印一次变量的值和地址。
// p1.cpp
int main() {
int x = 13;
int *p = &x;
while (true) {
cout << " value of x: " << *p << " addr: " << p << endl;
sleep(1);
}
}
Run Code Online (Sandbox Code Playgroud)
另一个 (p2.cpp),我手动将指针指向 p1.cpp 打印的位置并更改值。
//p2.cpp
int main() {
int *p = (int*)0x61ff08; // this is manually set and compiled.
cout << "value of p from p2.cpp : " << *p << endl;
*p = 10;
}
Run Code Online (Sandbox Code Playgroud)
但是,在运行 p1.cpp、设置位置并运行 p2.cpp …
在下面的程序中,如果算术表达式出现问题,我们如何使编译器发出警告/错误。
如果算术表达式产生的值超过其类型的最大值,我希望编译器发出警告/错误。
我已经使用编译了下面的程序gcc (GCC) 4.8.5 20150623 (Red Hat 4.8.5-4),使用的编译命令是gcc int_promo_flags.c -Wall -Wextra
我期待来自 line 的警告/错误long long int y = x + INT_MAX;,但没有报告错误/警告。
通过强制转换x,(long long) x我们可以使表达式产生正确的值。但是,如果算术表达式将溢出其参数类型,是否有任何编译器标志会发出警告。
#include <stdio.h>
#include <limits.h>
int main()
{
int x = 1;
long long int y = (long long) x + INT_MAX;
printf("%lld\n", y);
return 0;
}
Run Code Online (Sandbox Code Playgroud) c compiler-errors integer-overflow compiler-warnings type-promotion
我正在读一本书,其中有这一段:
C 中的数组可以看作是一块连续的内存。更准确地说,数组的最后一维是连续部分。我们称之为行优先顺序。了解这一点以及在访问未缓存的数据时缓存错误将完整的缓存行加载到缓存中以防止后续缓存错误的事实,我们可以理解为什么使用 array[0][0] 访问维度为 10000x10000 的数组可能会加载 array[ 0][1] 在缓存中,但随后访问 array[1][0] 会产生第二个缓存错误,因为它与 array[0][0] 相距 sizeof(type)*10000 字节,因此肯定不是在同一缓存线上。这就是为什么这样迭代效率低下的原因:
#define ARRLEN 10000
int array[ARRLEN][ARRLEN];
size_t i, j;
for (i = 0; i < ARRLEN; ++i)
{
for(j = 0; j < ARRLEN; ++j)
{
array[j][i] = 0;
}
}
Run Code Online (Sandbox Code Playgroud)
您能否向我解释一下他们在本段中试图解释的内容以及他们所谈论的“缓存故障”是什么?