gcc 5和clang 3.6都不会在restrict限定符的约束被违反的情况下发出警告,即使在调用时也是如此-Wall.请考虑以下代码片段:
extern void f(char *restrict p, char *restrict q);
void g(char *p)
{
f(p, p);
}
Run Code Online (Sandbox Code Playgroud)
天真地,我希望可以静态地确定违规行为,我期待这-Wall会发出警告.我在某个地方错过了一面旗帜,还是在发出一些我没有看到警告的问题?
为什么Idris要求函数按照它们的定义顺序出现并且相互递归声明mutual?
我希望Idris在函数之间执行依赖性分析的第一遍,并自动重新排序.我一直相信Haskell会这样做.为什么在伊德里斯这不可能?
我有一个包含原子场的结构:
#include <stdatomic.h>
struct s {
...
atomic_int a;
};
Run Code Online (Sandbox Code Playgroud)
该结构分配有calloc:
struct s *p = calloc(1, sizeof(struct s));
Run Code Online (Sandbox Code Playgroud)
是否可以预期p->a初始化为0?代码中有足够的障碍,因此初始化很弱,但是初始值是否保证为0?
可以通过tor网络启动TCP连接吗?我环顾四周但没有找到它.
如果没有,是否有类似TCP的东西 - 像websockets - 可以用来代替?
注意:目前没有源代码供我发帖,因为还没有.这只是事先的研究.
我有常春藤桥CPU.以下代码每次迭代需要3个周期:
L1:
movapd xmm1, [rsi+rax] ; X[i], X[i+1]
mulpd xmm1, xmm2
movapd xmm0, [rdi+rax] ; Y[i], Y[i+1]
subpd xmm0, xmm1
movapd [rdi+rax], xmm0 ; Store result
add rax, 16
cmp rax, rcx
jl L1
Run Code Online (Sandbox Code Playgroud)
以下每次迭代需要9个周期:
L1:
movapd xmm1, [rsi+rax] ; X[i], X[i+1]
mulpd xmm1, xmm2
movapd xmm0, [rdi+rax] ; Y[i], Y[i+1]
add rax, 16
subpd xmm0, xmm1
movapd [rdi+rax], xmm0 ; Store result
cmp rax, rcx
jl L1
Run Code Online (Sandbox Code Playgroud)
唯一的区别是order(add rax, 16).并且它导致程序慢3倍.为什么差异如此之大?