草庐IT

c++ - 为什么 endl 被用作 "\n"的同义词,即使它会导致显着的性能损失?

这个程序:#include#include#includeintmain(intargc,constchar*argv[]){using::std::cerr;using::std::cout;using::std::endl;if(argc3){cerr]\n";return1;}unsignedlongcount=10000;if(argc>2){char*endptr=0;count=::std::strtoul(argv[1],&endptr,10);if((argv[1][0]=='\0')||(*endptr!='\0')){cerr]\n";return1;}}const

c++ - std::endl 使 Windows 8 崩溃,使用 MinGW 编译

我有3台计算机,其中两台使用Windows8。使用最新版本的MinGW的g++(4.8.1-4),每当我在Windows8计算机上编译和运行时,我的helloworld程序就会卡住,但在Windows7中不会。#includeintmain(){std::cout这在g++中编译得很好,但运行a.exe将显示“Hello,World!”然后会弹出一个窗口说“a.exe已经停止工作,Windows可以在线检查该程序的解决方案......”等等。有没有人见过这个问题。另外,我试过“std::cout按照Eric的建议,我重新编译了程序并在gdb中运行它,得到了以下输出:Programrec

c++ - std::endl 和可变参数模板

这个问题在这里已经有了答案:Cannothavetypeof(std::endl)astemplateparameter?(2个答案)关闭8年前。代码:#includevoidout(){}templatevoidout(Tvalue,Args...args){std::cout构建错误:g++-O0-g3-Wall-c-fmessage-length=0-std=c++11-pthread-MMD-MP-MF"main.d"-MT"main.d"-o"main.o""../main.cpp"../main.cpp:Infunction‘intmain()’:../main.cpp:1

c++ - 不能将 typeof(std::endl) 作为模板参数?

所以,我试着写一个这样的函数:voidappend_to_stream(std::ostream&stream){}templatevoidappend_to_stream(std::ostream&stream,Tfirst,Args&&...rest){stream并这样调用它:append_to_stream(stream,std::endl,std::endl);但这行不通。我收到一条错误消息,指出该函数“参数过多”。我已经将范围缩小到我知道std::endl的程度是有罪的——可能是因为它是一个函数。我设法通过声明一个名为endl的结构来“解决”这个问题并定义为此,它只需调用s

c++ - 缓冲区刷新: "\n"与 std::endl

这个问题在这里已经有了答案:关闭10年前。PossibleDuplicate:C++:“std::endl”vs“\n”在AcceleratedC++中,提到了两件事:大多数系统都需要花费大量时间将字符写入输出设备。因此,C++将要写入的字符累积到缓冲区中,并等待缓冲区被刷新。可以刷新缓冲区的一种方法是,如果我们使用std::endl明确告诉它这样做。这让我想知道:显然,除了最大的输出之外,所有的好处都非常并且不明显,但是使用"\n"比使用std::endl,或者"\n"是否也刷新缓冲区?

c++ - 什么决定从 std::endl 输出哪些字节

我有一个大型代码库,它使用std::cout来生成它的输出,并且它在所有地方都使用std::endl来生成它的换行符。该程序似乎只为endl生成换行符,这本身并不是一个大问题,但无论出于何种原因,这都不是我所期望的。因此,作为现实检查,我构建了一个简单的程序来将endl泵入cout,使用相同的编译器对其进行编译并检查其输出。那个程序为endl发出CR和LF。看起来大型程序并没有使用cout玩任何游戏来改变endl的工作方式,至少我无法识别,所以它的行为与小程序不同似乎很奇怪。似乎大型程序必须做一些事情来改变默认值。我在这里缺少什么?这两个程序都是在32位Windows上使用MinGWg

c++ - endl 不适用于 wstring (unicode)

代码如下:std::ofstreamf("file1.txt");f在(*1)的情况下有一个换行符,在(*2)和(*3)的情况下,我在file2.txt中看不到换行符。在(*3)中有一个换行符。我使用notepad.exe进行浏览。十六进制编辑器没有显示0x0D字节,只有0x0A。我应该如何正确地将换行符放入unicode文本文件中?谢谢。 最佳答案 这是预期的:std::endl将L'\n'写入宽字符流(并刷新它,但此处不相关),从不L"\r\n"。当编写文字L"\n"时,这一点更加明显。WriteFile不执行任何类型的换行符替

c++ - 输出 endl 时出现 Clang 段错误

我正在尝试Clang(版本3.4,通过Windows预构建的二进制文件),看看它是否适合替代GCC(版本4.8.1,使用MinGW);但是,我无法让一个简单的程序运行。#includeintmain(){std::coutClang能够编译和链接程序,但运行它会产生SIGSEGV信号和返回码0xC0000005。输出字符串可以正常工作,但std::flush会导致相同的结果,尽管允许流自动刷新本身是可以的。调试程序只显示包含__mingw_CRTStartup()的调用堆栈(Clang使用libstdc++,因为它没有安装libc++)和std::cout().可能是什么原因造成的,如

c++ - 为什么 endl(std::cout) 编译

令人惊讶的是,下面的代码在各种编译器和版本上编译和运行都没有错误。#includeintmain(){endl(std::cout);return0;}Ideonelink它是如何编译的?我确信在全局范围内没有endl因为像这样的代码std::cout除非使用using否则会失败,否则您需要std::endl。 最佳答案 这种行为称为argumentdependentlookup或Koenig查找。该算法告诉编译器不仅要查看本地范围,还要查看包含参数类型的命名空间,同时查找unqualified函数调用。例如:namespacefo

c++ - "std::cout << std::endl;"如何编译?

大多数IOstreammanipulators是具有以下签名的常规函数​​:std::ios_base&func(std::ios_base&str);然而,一些操纵器(包括最常用的操纵器-std::endl和std::flush)是以下形式的模板:templatestd::basic_ostream&func(std::basic_ostream&os);那么,std::cout的编译过程是怎样的?假设以下示例失败,则成功:$catmain.cpp#includeintmain(){automyendl=std::endl;std::cout很明显,上下文(在std::cout中)有