我在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) 考虑以下假设类型:
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)是保证是任一0或1.
但我想知道编译器是否会优化以下内容
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在这个实例中的行为,因为它是我选择的编译器.
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)