小编A_U*_*ser的帖子

C/C++联合中元素的内存位置

我在C中有一个这样的联盟:

union AUnion {
  struct CharBuf {
    char *buf;
    size_t len;
  } charbuf;
  uint8_t num;
  double fp_num;
};
Run Code Online (Sandbox Code Playgroud)

我的问题是,如果给出以下内容,我可以保证:

union AUnion u;
Run Code Online (Sandbox Code Playgroud)

那么以下是真的:

&u == &u.num
&u == &u.fp_num
&u == &u.charbuf
Run Code Online (Sandbox Code Playgroud)

即它们都从u存储的内存段的开头开始.

在编译这个C程序的情况下,gcc version 5.3.0-std=c11上述是真实的:

#include <stdio.h>
#include <stdint.h>
#include <stdlib.h>

union AUnion {
    struct CharBuf {
        char *buf;
        size_t len;
    } charbuf;
    uint8_t num;
    double fp_num;
};

int main(void)
{
    union AUnion u;
    printf("%d\n", ((void*)&u) == ((void*)&u.charbuf));
    printf("%d\n", ((void*)&u.charbuf) == ((void*)&u.num));
    printf("%d\n", …
Run Code Online (Sandbox Code Playgroud)

c c++ unions c++11 c11

15
推荐指数
2
解决办法
1380
查看次数

编译器会优化条件中的双逻辑否定吗?

考虑以下假设类型:

typedef struct Stack {
    unsigned long len;
    void **elements;
} Stack;
Run Code Online (Sandbox Code Playgroud)

而下面的假设宏与类型处理(纯粹以增强可读性).在这些宏我假设给定的参数的类型为(堆叠*)而不是仅仅堆栈(我也懒得打字了_Generic表达这里.)

#define stackNull(stack) (!stack->len)
#define stackHasItems(stack) (stack->len)
Run Code Online (Sandbox Code Playgroud)

为什么我不只是!stackNull(x)用于检查堆栈是否有物品?我认为这样效率会稍微低一些(阅读:真的不明显,但我认为这很有趣),而不仅仅是检查,stack->len因为它会导致双重否定.在以下情况中:

int thingy = !!31337;
printf("%d\n", thingy);
if (thingy)
    doSomethingImportant(thingy);
Run Code Online (Sandbox Code Playgroud)

字符串"1 \n"将被打印,并且不可能优化条件(实际上,如果thingy变量没有常量初始化器或在测试之前被修改,那么这是不可能的,但我们会说此实例31337不是一个常数),因为(!!x)是保证是任一01.

但我想知道编译器是否会优化以下内容

int thingy = wellOkaySoImNotAConstantThingyAnyMore();
if (!!thingy)
    doSomethingFarLessImportant();
Run Code Online (Sandbox Code Playgroud)

这将被优化为在if语句中实际使用(thingy),就像if语句被写为

if (thingy)
    doSomethingFarLessImportant();
Run Code Online (Sandbox Code Playgroud)

如果是这样,它会扩展到(!!!!!thingy)等等吗?(然而,这是一个稍微不同的问题,因为这可以在任何情况下进行优化,!thingy!!!!!thingy无论什么时候,就像-(-(-(1))) = -1.)

在问题标题中我说"编译器",我的意思是我在问是否有任何编译器这样做,但是我特别感兴趣的是GCC在这个实例中的行为,因为它是我选择的编译器.

c optimization

6
推荐指数
1
解决办法
163
查看次数

Python3的内置zip功能问题

Python 3.4.2 (default, Oct  8 2014, 13:44:52) 
[GCC 4.9.1 20140903 (prerelease)] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> gen = (x for x in range(10)) ## Need to wrap range into ()'s to create a generator, next(range(10)) is invalid
>>> list(zip(gen, [1,2,3])) ## zip will "eat up" the number 3
[(0, 1), (1, 2), (2, 3)]
>>> next(gen) ## Here i need next to return 3
4
>>> 
Run Code Online (Sandbox Code Playgroud)

问题是我在拉链电话后丢失了一个值.如果gen不是纯粹的代码,这将是一个更大的问题.

我不知道是否可以创建一个行为类似的函数,如果zip函数的一个参数只是一个生成器,其余的是"正常"迭代器,其中所有的值都是已知,并存储在内存中.如果是这种情况,您可以最后检查发电机.

基本上我想知道的是,如果python标准库中有任何函数,就像我在这种情况下需要的那样.

当然,在某些情况下,人们可以做类似的事情

xs …
Run Code Online (Sandbox Code Playgroud)

python zip

5
推荐指数
1
解决办法
910
查看次数

标签 统计

c ×2

c++ ×1

c++11 ×1

c11 ×1

optimization ×1

python ×1

unions ×1

zip ×1