为可变大小的数组分配内存时,我经常这样做:
struct array {
long length;
int *mem;
};
struct array *alloc_array( long length)
{
struct array *arr = malloc( sizeof(struct array) + sizeof(int)*length);
arr->length = length;
arr->mem = (int *)(arr + 1); /* dubious pointer manipulation */
return arr;
}
Run Code Online (Sandbox Code Playgroud)
然后我使用这样的arrray:
int main()
{
struct array *arr = alloc_array( 10);
for( int i = 0; i < 10; i++)
arr->mem[i] = i;
/* do something more meaningful */
free( arr);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
这工作和编译没有警告.然而,最近我读到了严格的别名.根据我的理解,上面的代码在严格别名方面是合法的,因为通过它访问int *的内存不是通过它访问的内存struct array …
我知道对于无符号整数,如果除数是 2 的幂,我可以用位掩码替换模运算。对于浮点数,是否有任何数字具有类似的属性?也就是说,是否有任何数字n可以f mod n比一般情况更有效地计算,而不必使用位掩码?
当然,除了一个。 脑部衰竭
编辑:澄清一下,f是任何浮点数(在运行时确定),
n是任何格式的任何编译时常量,我希望结果是浮点数。
我正在学习普通口齿不清。我已经编写了该once-only宏的一个版本,该宏存在一个异常的变量捕获问题。
我的宏是这样的:
(defmacro my-once-only (names &body body)
(let ((syms (mapcar #'(lambda (x) (gensym))
names)))
``(let (,,@(mapcar #'(lambda (sym name) ``(,',sym ,,name))
syms names))
,(let (,@(mapcar #'(lambda (name sym) `(,name ',sym))
names syms))
,@body))))
Run Code Online (Sandbox Code Playgroud)
的标准版本only-once是这样的:
(defmacro once-only ((&rest names) &body body)
(let ((gensyms (loop for n in names collect (gensym))))
`(let (,@(loop for g in gensyms collect `(,g (gensym))))
`(let (,,@(loop for g in gensyms for n in names collect ``(,,g ,,n)))
,(let (,@(loop for n in …Run Code Online (Sandbox Code Playgroud)