小编lle*_*edr的帖子

标准库`FILE`类型

可能重复:
为什么FILE全部大写与FILE*一样?

为什么标准库FILE类型写成大写?
是因为它不透明的性质?

谢谢.

c

15
推荐指数
1
解决办法
1万
查看次数

静态分支预测/ GCC优化

考虑以下C程序:

void bar();
void baz();

void foo( int a ) {
    if ( a ) {
        bar();
    }
    else {
        baz();
    }
}
Run Code Online (Sandbox Code Playgroud)

在我的基于x86-64的计算机上,GCC使用-O1优化级别生成的指令给出:

 0: sub    $0x8,%rsp
 4: test   %edi,%edi
 6: je     14 <foo+0x14>
 8: mov    $0x0,%eax
 d: callq  12 <foo+0x12> # relocation to bar
12: jmp    1e <foo+0x1e>
14: mov    $0x0,%eax
19: callq  1e <foo+0x1e> # relocation to baz
1e: add    $0x8,%rsp
22: retq
Run Code Online (Sandbox Code Playgroud)

而添加-freorder-blocks优化参数(包含在-O2中)会将代码转换为:

 0: sub    $0x8,%rsp
 4: test   %edi,%edi
 6: jne    17 <foo+0x17>
 8: mov    $0x0,%eax
 d: …
Run Code Online (Sandbox Code Playgroud)

c optimization assembly gcc x86-64

7
推荐指数
1
解决办法
1613
查看次数

Java语法定义完整性

虽然JLS规范中似乎非常精确地描述了Java语法,但是有一些具体案例我无法应用于给定的定义.

例如,采用ClassInstanceCreationExpressionJLS8第15.9章中的规则,非限定new表达式应采用以下形式:

new [TypeArguments] {Annotation} Identifier [TypeArgumentsOrDiamond] ( [ArgumentList] ) [ClassBody] 
Run Code Online (Sandbox Code Playgroud)

Identifier是一个标准的Java标识符(基本上是Java字母/数字,没有点).

该定义如何应用于静态嵌套类instanciation等有效表达式:

new C1.C2();
Run Code Online (Sandbox Code Playgroud)

或包合格的类instanciation:

new java.lang.String("foo");
Run Code Online (Sandbox Code Playgroud)

鉴于点不能成为一部分Identifier

请注意,对于非限定new表达式,此定义从JLS7更改为JLS8,其中JLS7 表示:

new [TypeArguments] TypeDeclSpecifier [TypeArgumentsOrDiamond]( [ArgumentList] ) [ClassBody]
Run Code Online (Sandbox Code Playgroud)

TypeDeclSpecifier 被定义为:

TypeDeclSpecifier:
    TypeName
    ClassOrInterfaceType . Identifier 
Run Code Online (Sandbox Code Playgroud)

允许new静态嵌套类和包限定类的非限定表达式.

java grammar jls

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

标签 统计

c ×2

assembly ×1

gcc ×1

grammar ×1

java ×1

jls ×1

optimization ×1

x86-64 ×1