小编ego*_*ego的帖子

如何在一个malloc调用中为数组和结构分配内存而不破坏严格的别名?

为可变大小的数组分配内存时,我经常这样做:

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 …

c memory-management strict-aliasing

18
推荐指数
2
解决办法
716
查看次数

是否有任何数字可以对浮点数进行快速模计算?

我知道对于无符号整数,如果除数是 2 的幂,我可以用位掩码替换模运算。对于浮点数,是否有任何数字具有类似的属性?也就是说,是否有任何数字n可以f mod n比一般情况更有效地计算,而不必使用位掩码?

当然,除了一个。 脑部衰竭

编辑:澄清一下,f是任何浮点数(在运行时确定), n是任何格式的任何编译时常量,我希望结果是浮点数。

c floating-point modulo fmod

5
推荐指数
2
解决办法
959
查看次数

使用gensym符号如何进行宏变量捕获?

我正在学习普通口齿不清。我已经编写了该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)

lisp macros common-lisp

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