关于O2下的inline与register

学术版

没有。
by ud2_ @ 2021-05-06 00:24:51


@[aldol_reaction](/user/393190) inline仍然有必要,O3会帮你inline,O2不会。 register自C++11开始无论以何种方式编译都没必要加,编译器会无视。自C++14起register被判为编译错误。
by GKxx @ 2021-05-06 01:02:38


@[GKxx](/user/72071) 开了O2的前提下,可以认为只有必要在没有递归和循环的函数前面加inline吗?有递归和循环我就不加inline,其他都加上?对函数的行数有要求吗(萌新发问qwq)
by aldol_reaction @ 2021-05-06 08:19:48


@[aldol_reaction](/user/393190) 这个啊 比较短小的函数 就我个人而言 一般会对于 `min`,`max`,`ls`,`rs`之类很短小的函数加上 `inline`,实测效果加快明显
by Anita_Hailey @ 2021-05-06 08:26:19


@[SiRiehn_nx](/user/232125) 比如pushdown那种很长的还需要加吗QAQ and 有循环和递归的函数是不是加了就会负优化啊qwq
by aldol_reaction @ 2021-05-06 09:19:15


@[aldol_reaction](/user/393190) `inline` 相当于只是一个建议,编译器可能无视。据我所知,递归函数加 `inline` 的话有的编译器甚至可能帮你展开几层。
by 滑蒻稽 @ 2021-05-06 10:57:53


@[aldol_reaction](/user/393190) inline只是向编译器发出一个请求,至于编译器到底帮不帮你inline是由编译器决定的。算法竞赛中不需要考虑目标代码的大小问题,你大可以把所有函数都加上inline。 详见《Effective C++》条款30:透彻了解inlining的里里外外。
by GKxx @ 2021-05-06 12:16:31


@[aldol_reaction](/user/393190) 《C++ Primer》给出的说法是“编译器很难为一个长达75行的函数内联展开,此外,绝大多数编译器都会拒绝递归函数的内联展开”。 总之,inline只是一个请求。对于不能inline的函数编译器自然会拒绝,无需担心。那些编译器不会拒绝的inline请求可能会带来的问题在算法竞赛中还用不着考虑。
by GKxx @ 2021-05-06 12:21:41


@[GKxx](/user/72071) 好耶!总结下您的意思:所有函数都可以加上inline,但是inline成功与否取决于编译器。对于含递归和循环的函数,即使加上inline,编译器也会拒绝,所以其实没必要加。所以实际写的时候我只需要把**没有递归和循环的函数都**加上inline就可以了。(开O2的前提下)。不知道我是否可以这样理解和这样做QAQ
by aldol_reaction @ 2021-05-06 13:04:47


@[aldol_reaction](/user/393190) 可以这样理解,也可以这样做。你哪怕把所有函数都inline也没问题。
by GKxx @ 2021-05-06 13:58:10


| 下一页