编译失败????

P5018 [NOIP2018 普及组] 对称二叉树

`node` 初始化应该这样写: ```cpp struct node { int l, r, w, num; node(void) : l(-1), r(-1), w(11451419), num(-1) {} }; ```
by jesse1216 @ 2024-06-06 12:02:12


[AC 了](https://www.luogu.com.cn/record/161402313) @[gmyinSU](/user/1122449)
by jesse1216 @ 2024-06-06 12:03:43


@[jesse1216](/user/530437) 感谢大佬指点
by gmyinSU @ 2024-06-06 12:04:41


@[jesse1216](/user/530437) 偶遇jesse
by chenyyegg @ 2024-06-06 12:05:47


@[gmyinSU](/user/1122449) 这个编码是合法的,只是编译不出来。 编译出错原因: 在全局区定义大量编译期确定的非零变量导致编译出的可执行文件超出洛谷限制,从而直接 CE。 `Nothing is compiled: OUTPUT exceeds.` 你应该看看你本地生成的`.exe`或者其他可执行文件的大小,这个文件占用的空间绝对不小。(我这里的可执行文件大小为 $16.15 \mathrm{MiB}$) 其他 OJ 能编译出来只是因为他们给可执行文件开的空间很大,或者压根没有特殊限制。 --- 在全局区定义数组/结构体/类时,某些初始化方式意味着赋一个值需要有可执行程序文件中的专门一条指令与之对应,甚至只给其中某一个赋一个非零值,整个定义里的所有量都需要一一赋值,例如 `int a[1000000]={1};` 需要生成 $1000000$ 条可执行程序中命令,而这些命令都要写在`.exe`(或其他文件)里。`struct` 内部赋值同理。 使用类的构造函数进行赋值不是编译期进行的,所以可以编译出来。 除此之外,洛谷环境中栈区 `int a[1000000]={1};` 实现方式是给 `a[0]` 赋值 $1$,然后后面的变量都用 `__builtin_memset` 扫一遍赋值 $0$,所以这么用在栈区是合理的,但是在全局区不行。同样地,你把 `node nod[N];`定义到栈区也不会 CE。 ```cpp ... struct node{ int l=-1; int r=-1; int w=11451419; int num=-1; }; node*nod; ... int main(){ node _nod[N];nod=_nod; ... } ```
by Terrible @ 2024-06-06 12:45:36


注:在栈区的 `node _nod[N];` 的实现不是用 `memcpy`,是运行期间一个个赋值,`int a[1000000]={1}` 会用 `memset` 扫一遍。
by Terrible @ 2024-06-06 12:50:54


@[Terrible](/user/195942) 多谢大佬指点! 平时不怎么了解编译器底层运行的机制,犯了这个错误。今天长脑子了
by gmyinSU @ 2024-06-06 12:56:00


|