我有一些遗留代码,可以使用-02和-03集合进行编译.从GCC man文件中我得到以下保证:
-O3打开-O2指定的所有优化,并打开-finline-functions,-funswitch-loops,-fpredictive-commoning,-fgcse-after-reload和-ftree-vectorize选项.
因此,乍看之下,打开这两个标志似乎与-O3相同.然而,让我想到的是,在这种情况下做正确的事情是-O2可能是"更安全"的选择.显然,编译一些具有所有排列的代码并查看每种情况会发生什么是一件简单的事情,但我想知道是否有人知道GCC是否有关于指定多个优化级别的具体策略,如果是的话它背后的原因是什么?
我一直在考虑如何在C宏中验证类型,到目前为止,我提出的最佳方法是:
#define ASSERT_PTYPE(TYPE, VALUE) (0 && (*(int (*)(TYPE*))0)(VALUE))
Run Code Online (Sandbox Code Playgroud)
这显然需要一个类型名称和指向该类型的指针.也可以制作类似的ASSERT_TYPE宏.这对GCC来说似乎很有效.它甚至在类型不匹配的情况下提供了非常有用的错误消息.问题是我不能完全确定这是有效的C还是最好的方法.
据我所知,标准说您可以转换函数指针,但调用转换函数指针的结果是未定义的.在这种情况下,不可能在运行时调用该函数.这是否足够好或标准意味着你甚至不能编写无法调用的代码来调用强制转换函数?
有没有人知道C++中一个好的monad模板库.或许,提供一些你会在Haskell中看到的常见monad,就像Maybe一样.
我似乎缺少一些关于提升字符串算法的东西.我正在尝试使用带有Clasifier的split_iterator作为分割点.所以,例如我希望能够做到这样的事情:
make_split_iterator(str, is_space);
Run Code Online (Sandbox Code Playgroud)
但是make_split_iterator需要一个Range和一个Finder.所以我需要找到一些序列来从分类器创建一个Finder.有谁知道怎么做,或者甚至可能吗?