幻の上帝 幻の上帝
关注数: 156 粉丝数: 1,931 发帖数: 72,393 关注贴吧数: 291
[H2O]又被编译器坑了 main.cpp 6> ' 6> In file included from f:/Programing/NDS/YSTest/YSTest_ARM9/../YBase/include/ystdex/string.hpp(31):0, 6> from f:/Programing/NDS/YSTest/YSTest_ARM9/../YFramework/include/CHRLib/chrproc.h:34, 6> from f:/Programing/NDS/YSTest/YSTest_ARM9/../YFramework/include/YSLib/Core/../Adaptor/yadaptor.h:51, 6> from f:/Programing/NDS/YSTest/YSTest_ARM9/../YFramework/include/YSLib/Core/ysdef.h:37, 6> from f:/Programing/NDS/YSTest/YSTest_ARM9/../YFramework/include/YSLib/Core/ycutil.h:31, 6> from f:/Programing/NDS/YSTest/YSTest_ARM9/../YFramework/include/YSLib/Core/yobject.h:32, 6> from f:/Programing/NDS/YSTest/YSTest_ARM9/../YFramework/include/YSLib/Core/ymsg.h:31, 6> from f:/Programing/NDS/YSTest/YSTest_ARM9/../YFramework/include/YSLib/Core/ymsgdef.h:31, 6> from f:/Programing/NDS/YSTest/YSTest_ARM9/../YFramework/include/YSLib/Core/yshell.h:31, 6> from f:/Programing/NDS/YSTest/YSTest_ARM9/../YFramework/include/Helper/shlds.h:32, 6> from f:/Programing/NDS/YSTest/YSTest_ARM9/include/Shells.h:35, 6> from f:/Programing/NDS/YSTest/YSTest_ARM9/include/ReaderSetting.h:31, 6> from f:/Programing/NDS/YSTest/YSTest_ARM9/source/ReaderSetting.cpp(28): 6> in finish_decltype_type, at cp/semantics.c:5274 6> Please submit a full bug report, 6> with preprocessed source if appropriate. 6> See <http://tieba.baidu.com/mo/q/checkurl?url=http%3A%2F%2Fwiki.devkitpro.org%2Findex.php%2FBug_Reports&urlrefer=d522b17b3975d516607f8fbd0d5bf6f4> for instructions. 6> make[1]: *** [ReaderSetting.o] Error 1 6> make[1]: *** Waiting for unfinished jobs.... 6> make: *** [debug] Error 2 明明同个版本的mingw是正常的,交叉编译就造反了。。。
[原创][翻译]为什么每个C程序员应该了解未定义行为#1 原文:blog.llvm.org/2011/05/what-every-c-programmer-should-know.html   人们偶尔会问为什么LLVM的汇编代码有时会在优化器打开时产生SIGTRAP信号。经过深入研究,他们发现Clang生成了“ud2”指令(假设x86代码)——和__builtin_trap()生成的一样。这里关系到若干问题,都围绕C代码的未定义行为和LLVM如何处理它展开。   本博文(作为包括三篇的一个系列的第一篇)试图解释其中的一些问题,以便使读者可以更好地了解为此作出的权衡和复杂性,也许还有C的一些阴暗面。这证实C不像许多有经验的C程序员(特别是注重底层的)认为的,是一种“高级汇编”,并且C++和Objective-C已经直接继承它的很多问题。 未定义行为 日语翻译:blog-ja.intransient.info/2011/05/c-13.html   LLVM IR和C语言都有“未定义行为”的概念。未定义行为是一个广泛的话题,包含很多细节。最好的介绍,我发现的最好的介绍是John Regehr的博文(blog.regehr.org/archives/213 )。这篇优秀的文章的大意是许多看似合理的东西在C中实际上存在未定义行为,这是一种常见的程序的错误来源。此外,任何未定义行为准许实现(编译器和运行时)产生这样的代码:格式化您的硬盘驱动器、做完全意想不到的事情,或者更糟(http://tieba.baidu.com/mo/q/checkurl?url=http%3A%2F%2Fwww.catb.org%2Fjargon%2Fhtml%2FN%2Fnasal-demons.html&urlrefer=3aad0b7d34268e949699e9b358ccb3b0 )。我再次强烈建议阅读John的文章。   未定义行为在基于C的语言中存在,因为C的设计者希望它成为一个高效的低层次的编程语言。相比之下,像Java(和许多其他的“安全”的语言)已回避未定义行为,因为他们想要在实现之间的行为安全、可重现,并愿意为此牺牲性能。无论哪一个都不是“(应该)致力于的正确的目标”,如果你是一个C程序员,你真的应该明白未定义行为是什么。   在详细讨论之前,这里有必要简要提及,编译器需要做什么以使广泛的C应用程序取得良好的性能,因为没有灵丹妙药。在一个很高的层次上,编译器通过如下手段产生一个高性能的应用程序:a)良好的必需算法的实现,像寄存器分配,调度算法,等等。b)了解很多“招数”(如窥孔优化、循环变换等),并在有利时运用它们。c)善于消除不必要的抽象(如C中的宏导致的冗余、内联函数、消除C++临时对象等。以及d)不把任何东西搞砸。下面提到的优化可能听起来微不足道的,但实际上在一个关键循环仅节省一个周期就可以使一些编解码器的运行速率提高10%或节约10%的电源。 C中未定义行为的优势与例子   在进入未定义行为和作为一个C编译器使用时的LLVM的策略和行为的阴暗面之前,我想考虑一些未定义行为的具体用例,并讨论它们各自如何使性能比像Java那样的安全语言更好,是有帮助的。读者可以把它看作通过未定义行为“启用优化”或导致需要使每个用例被定义的“避免开销”。虽然在某些时候编译器优化器可以消除其中的某些开销,一般地(在所有情况下)这样做将需要解决停机问题和许多其它的“有趣的挑战”。   值得指出的还有,Clang和GCC都确定了C标准保留未定义的一些行为。我将描述的东西是按照标准和被这两个编译器的默认模式下都作为未定义的行为。   使用未初始化的变量:这被公认为在C程序中产生问题的一个源头,有很多工具来捕获这些:从编译器的警告到静态和动态分析。不要求所有的变量在进入作用域时被零初始化(像Java那样)可以提高性能。对于多数标量变量,零初始化会引起很小的开销,但对栈数组和malloc得到的内存会引发对存储的memset操作,这可能相当昂贵,特别是这些存储通常被完全覆写。   有符号整数溢出:若(例如)“int”类型的算术操作溢出,结果是未定义的。一个例子是“INT_MAX+1”不保证是INT_MIN。这种行为可以对某些代码启用特定类别的重要优化。例如,了解INT_MAX+1未定义允许优化“X+1>X”为“true”。允许乘法“不能”溢出(因为这样做将是未定义的)允许优化“X*2/2”为“X”。这些看起来像是微不足道的,因为这类操作通常被内联和宏展开。这允许的一个更重要的优化是对于“<=”循环,如下:
[科普]字符串和字符串的长度 首先明确几个概念: 字符串:形式语言理论研究的基本对象之一,是字符的有限序列。 以下引用中文喂鸡“字符串”: 设∑是叫做字母表的非空有限**。∑的元素叫做“符号”或“字符”。在∑上的字符串(或字)是来自∑的任何有限序列。例如,如果∑ = {0, 1},则0101是在∑之上的字符串。 字符串的长度是在字符串中字符的数目(序列的长度),它可以是任何非负整数。“空串”是在∑上的唯一的长度为0的字符串,并被指示为ε或λ。 注意,这里的长度的概念是足够清晰的。 以下引用中文喂鸡“字符串->字符串数据类型”: 字符串长度 尽管形式字符串可以有任意(但有限)的长度,实际语言的字符串的长度经常被限制到一个人工极大值。一般的说,有两种类型的字符串数据类型:“定长字符串”,它有固定的极大长度并且不管是否达到了这个极大值都使用同样数量的内存;和“变长字符串”,它的长度不是专断固定的并且依赖于实际的大小使用可变数量的内存。在现代编程语言中的多数字符串是变长字符串。尽管叫这个名字,所有变长字符串还是在长度上有个极限,一般的说这个极限只依赖于可获得的内存的数量。 …… 表示法 一种常用的表示法是使用一个字符代码的数组,每个字符占用一个字节(如在ASCII代码中)或两个字节(如在unicode中)。它的长度可以使用一个结束符(一般是NUL,ASCII代码是0,在C编程语言中使用这种方法)。或者在前面加入一个整数值来表示它的长度(在Pascal语言中使用这种方法)。 【例略】 可见字符串的长度和存储的关系是不唯一的。 在C/C++中可以使用多种形式表示和存储的字符串。最常见的基本的字符串表示形式(即C标准库/C++标准库都使用的形式)通称为C风格字符串,ISO C++的学名是NTCTS(null terminated character string)。 ISO C++11 17.3.17 [defns.ntcts] NTCTS a sequence of values that have character type that precede the terminating null character type value charT() 具体说来,一个典型的场景是:多余一个元素的char/wchar_t/char16_t/char32_t/其它实现允许的扩展字符类型的数组可以放一个NTCTS。 注意,a sequence of values而不是characters,表示抽象的含义。下面会看到character(但不是multibyte character)在C++标准库中的明确受限的意义。 顺便,关于multibyte character是C++整体通用的基本术语之一,所以独立于character之外考虑: ISO C++11 1.3.13 [defns.multibyte] multibyte character sequence of one or more bytes representing a member of the extended character set of either the source or the execution environment [ Note: The extended character set is a superset of the basic character set (2.3).—end note ] (至于字符、基本执行字符集什么的虽然是必要基础但理解起来很简单,暂且不在此展开。) ISO C++11 17.5.2.1.4 Character sequences [character.seq] 1 The C standard library makes widespread use of characters and character sequences that follow a few uniform conventions: — A letter is any of the 26 lowercase or 26 uppercase letters in the basic execution character set.166 — The decimal-point character is the (single-byte) character used by functions that convert between a (single-byte) character sequence and a value of one of the floating-point types. It is used in the character sequence to denote the beginning of a fractional part. It is represented in Clauses 18 through 30 and Annex D by a period, ’.’, which is also its value in the "C" locale, but may change during program execution by a call to setlocale(int, const char*),167 or by a change to a locale object, as described in Clauses 22.3 and 27.
[MP]求简单实现 http://tieba.baidu.com/mo/q/checkurl?url=&urlrefer=9180cb13d9162ef0a654c461202e5314 yforward(_expr) std::forward<decltype(_expr)>(_expr) http://tieba.baidu.com/mo/q/checkurl?url=&urlrefer=9180cb13d9162ef0a654c461202e5314<http://tieba.baidu.com/mo/q/checkurl?url=&urlrefer=9180cb13d9162ef0a654c461202e5314 _type, http://tieba.baidu.com/mo/q/checkurl?url=&urlrefer=9180cb13d9162ef0a654c461202e5314... _tParams> yconstfn auto unsequenced(_type&& arg, _tParams&&...) -> decltype(yforward(arg)) {     http://tieba.baidu.com/mo/q/checkurl?url=&urlrefer=9180cb13d9162ef0a654c461202e5314 yforward(arg); } http://tieba.baidu.com/mo/q/checkurl?url=&urlrefer=9180cb13d9162ef0a654c461202e5314<size_t... _vSeq> http://tieba.baidu.com/mo/q/checkurl?url=&urlrefer=9180cb13d9162ef0a654c461202e5314 variadic_sequence {     http://tieba.baidu.com/mo/q/checkurl?url=&urlrefer=9180cb13d9162ef0a654c461202e5314 variadic_sequence<_vSeq..., http://tieba.baidu.com/mo/q/checkurl?url=&urlrefer=9180cb13d9162ef0a654c461202e5314...(_vSeq)> type; }; http://tieba.baidu.com/mo/q/checkurl?url=&urlrefer=9180cb13d9162ef0a654c461202e5314<size_t _vN> http://tieba.baidu.com/mo/q/checkurl?url=&urlrefer=9180cb13d9162ef0a654c461202e5314 make_natrual_sequence {     http://tieba.baidu.com/mo/q/checkurl?url=&urlrefer=9180cb13d9162ef0a654c461202e5314 http://tieba.baidu.com/mo/q/checkurl?url=&urlrefer=9180cb13d9162ef0a654c461202e5314 make_natrual_sequence<_vN - 1>::type::type type; }; http://tieba.baidu.com/mo/q/checkurl?url=&urlrefer=9180cb13d9162ef0a654c461202e5314<> http://tieba.baidu.com/mo/q/checkurl?url=&urlrefer=9180cb13d9162ef0a654c461202e5314 make_natrual_sequence<0> {     http://tieba.baidu.com/mo/q/checkurl?url=&urlrefer=9180cb13d9162ef0a654c461202e5314 variadic_sequence<> type; }; http://tieba.baidu.com/mo/q/checkurl?url=&urlrefer=9180cb13d9162ef0a654c461202e5314<http://tieba.baidu.com/mo/q/checkurl?url=&urlrefer=9180cb13d9162ef0a654c461202e5314> http://tieba.baidu.com/mo/q/checkurl?url=&urlrefer=9180cb13d9162ef0a654c461202e5314 unseq_dispatcher; http://tieba.baidu.com/mo/q/checkurl?url=&urlrefer=9180cb13d9162ef0a654c461202e5314<size_t... _vSeq> http://tieba.baidu.com/mo/q/checkurl?url=&urlrefer=9180cb13d9162ef0a654c461202e5314 unseq_dispatcher<variadic_sequence<_vSeq...>> {     http://tieba.baidu.com/mo/q/checkurl?url=&urlrefer=9180cb13d9162ef0a654c461202e5314<http://tieba.baidu.com/mo/q/checkurl?url=&urlrefer=9180cb13d9162ef0a654c461202e5314 _fCallable, http://tieba.baidu.com/mo/q/checkurl?url=&urlrefer=9180cb13d9162ef0a654c461202e5314... _tParams>     http://tieba.baidu.com/mo/q/checkurl?url=&urlrefer=9180cb13d9162ef0a654c461202e5314 http://tieba.baidu.com/mo/q/checkurl?url=&urlrefer=9180cb13d9162ef0a654c461202e5314 http://tieba.baidu.com/mo/q/checkurl?url=&urlrefer=9180cb13d9162ef0a654c461202e5314     call(_fCallable f, _tParams&&... args)     {         unsequenced((f(std::get<_vSeq>(std::forward_as_tuple(args...))), 0)...);     } }; http://tieba.baidu.com/mo/q/checkurl?url=&urlrefer=9180cb13d9162ef0a654c461202e5314<http://tieba.baidu.com/mo/q/checkurl?url=&urlrefer=9180cb13d9162ef0a654c461202e5314 _fCallable, http://tieba.baidu.com/mo/q/checkurl?url=&urlrefer=9180cb13d9162ef0a654c461202e5314... _tParams> http://tieba.baidu.com/mo/q/checkurl?url=&urlrefer=9180cb13d9162ef0a654c461202e5314 http://tieba.baidu.com/mo/q/checkurl?url=&urlrefer=9180cb13d9162ef0a654c461202e5314 unseq_apply(_fCallable f, _tParams&&... args) {     unseq_dispatcher<http://tieba.baidu.com/mo/q/checkurl?url=&urlrefer=9180cb13d9162ef0a654c461202e5314 make_natrual_sequence<         http://tieba.baidu.com/mo/q/checkurl?url=&urlrefer=9180cb13d9162ef0a654c461202e5314...(_tParams)>::type>::call(f, yforward(args)...); } unsequenced function call... 该死的parameter pack不支持调用表达式上下文只能弄成variadic template tuple…… 虽然-O3无压力。。。
[原创翻译]ISO C11 Annex C(final draft N1570) 附录C (参考件) 序列点(Sequence points) 1 以下是 5.1.2.3 中描述的序列点: — 一个函数调用中在函数指示符(function designator)和实际参数(actual arguments)的求值以及实际的调用之间。 (6.5.2.2) 。 — 在以下操作符的第一个和第二个操作数的求值之间: 逻辑与 && (6.5.13) ;逻辑或 || (6.5.14) ;逗号 , (6.5.17) 。 — 在条件 ?: 操作符的第一个操作数以及第一个或第三个操作数中任意一个被求值之间 (6.5.15) 。 — 一个完整声明符(full declarator)的结束:声明符(declarators) (6.7.6)。 — 一个完整表达式(full expression) 和下一个待求值的完整表达式的求值之间。以下是完整表达式:一个不属于组合字面量(‮dnuopmoc‬ literal)的初值符(initializer) (6.7.9);在表达式语句中的表达式 (6.8.3) ;一个选择语句(if或switch)中的控制表达式(controlling expression) (6.8.4) ;一个while或do语句(if或switch)中的控制表达式 (6.8.5) ;for语句中每个(可选的)表达式 (6.8.5.3) ;return语句中(可选的)表达式 (6.8.6.4) 。 — 紧接一个库函数返回之前 (7.1.4) 。 — 在每一个格式化输入/输出函数的转换指示符(conversion specifier)关联的动作之后 (7.21.6, 7.29.2) 。 — 紧接每个比较函数(comparison function)的调用之前和之后;在比较函数的任何调用以及调用中任何以参数传递的对象的转移(movement of the object)之间 (7.22.5) 。 [EOF]
首页 1 2 3 4 下一页