C++ 不使用cout、printf或put()打印某物

C++ 不使用cout、printf或put()打印某物,c++,c,C++,C,我知道了 inline ostream & _Cdecl ostream::operator<< (const signed char * _s) { outstr(_s, (const signed char *)0); return *this; } inline ostream&_cdeclostream::operator是的,您可以直接调用该函数,但是您这样做的推理是有缺陷的。与执行实际功能所需的时间相比,通过消除对操作员的子程序调用而节省的时间可

我知道了

inline ostream & _Cdecl ostream::operator<< (const signed char * _s) {
    outstr(_s, (const signed char *)0);
    return *this;
}

inline ostream&_cdeclostream::operator是的,您可以直接调用该函数,但是您这样做的推理是有缺陷的。与执行实际功能所需的时间相比,通过消除对操作员的子程序调用而节省的时间可以忽略不计;这就像是在敞篷车顶篷关闭时关闭车窗以减少雨水。

进行函数调用所需的时间远远小于打印字符串所需的时间。您可以(而且通常应该)忽略使用这种方法节省的时间。

您可以直接使用系统调用

例如,本页解释linux系统调用。您可以从我复制的链接开始,使用许多使用assembly的方法,或者用另一种方式说,在不调用它的函数的情况下执行某些操作

但我猜这是一个很难回答的问题,如果我有一家公司,我永远不会雇佣一个使用系统调用而不是函数的人

这是将sys_write(4)与standart输出(1)一起使用的示例。您可以将汇编代码内联到C/C++代码中。

< P>如果您希望跨所有符合标准的C++实现移植,您可以通过以下方式将字符串打印到标准输出:

const char * str = "Hello World\n";
fprintf(stdout, str);
fputs(str, stdout);
for (int i=0; str[i]!=0; ++i)
    putchar(str[i]);
for (int i=0; str[i]!=0; ++i)
    putc(str[i], stdout);
for (int i=0; str[i]!=0; ++i)
    fputc(str[i], stdout);
fwrite(str, sizeof(*str), strlen(str), stdout);
此外,您还可以使用
std::cerr
std::clog
。它们写入到
stderr
而不是
stdout
,但从用户的角度来看,这通常是同一个地方:

std::cerr << str;
std::clog << str;

std::cerr在UNIX类型的系统上,可以执行以下操作

#include <unistd.h>
#include <stdio.h>

int main()
  {
  const char x[] = "Hello World!";
  write(STDOUT_FILENO, x, strlen(x)); // Feel free to check the return value.
  return 0;
  }
#包括
#包括
int main()
{
const char x[]=“你好,世界!”;
write(STDOUT_FILENO,x,strlen(x));//请随意检查返回值。
返回0;
}

我很好奇你这样做的动机是什么。在信号处理程序之外,我不愿意进行这样的低级调用。I/O的性能将是时间的主要驱动因素,而不是通常经过大量优化/内联的中间函数调用。

“在iostream.h头文件中”->“在iostream.h头文件中”这样做不会节省任何重要的操作时间。另外,如果您想在不使用cout、printf或put的情况下打印某些内容,您可以尝试的一种解决方案是调用系统调用。@SidR当您第一次发表评论时,我认为您的意思是调用内核输出例程的某个系统特定函数(printf或poster的outstr调用可能会执行的低级调用)。调用system()函数来调用echo是一件可怕的事情,如果OP在面试中提出这一点,他不仅无法得到这份工作,还将遭受损失(此处插入荒谬的夸张)。@SidR当你调用
system()
时,你正在生成一个新的进程,如果其目的仅仅是输出某些东西,那么这是一种极其昂贵的操作。一般来说(也许总是,我不确定),该进程是一个shell,然后shell将生成第二个进程(对于echo命令,在您的情况下),因此将其单次成本可能无法接受的费用增加一倍。@mah:谢谢您的解释。虽然我承认我的理解并不完美,但我试图回答问题的一部分,他问我是否可以不使用printf、cout或put()打印某些内容。我想回答这个问题,因为这是在面试中问我的!有没有可能这是一个骗人的问题
printf
cout
put
等当然有一些内部实现,但这会因操作系统而异,也可能因编译器而异。没有合理的理由尝试重新实现标准库函数。这是我的方式。如果你有其他的方法,你可以建议。我必须同意@slavik262的回答,我建议在面试中,正确的回答是质疑问题本身(同时还解释说,如果确实需要,你知道足够多的知识,可以到较低的级别去执行某项任务——但同样重要的是,要证明你理解为什么可能不需要,也可能是危险的)。在现代编译器中,内联关键字与内联代码没有什么关系。现代编译器基本上忽略了这个术语(出于内联目的(编译器编写者很久以前就发现人类在决定代码何时应该内联时非常糟糕))。我希望有东西能回答我的问题,而不是对它发表评论。如果你能回答的话,谢谢你。你问的问题非常直白,是“我能用同样的函数在屏幕上打印字符串值吗?”我用我回答的第一个字回答了这个问题。你打算问为什么你尝试的东西不起作用吗?如果这是你的意图,那么最好是通过实际提问来实现,但在这种情况下,如果没有更多的信息,人们将无法回答(当你尝试时会发生什么,而不仅仅是“不起作用”).事实上,如果雨不是很大,我在车顶降下的情况下以>60 mph但小于75 mph的速度驾驶(具体速度取决于下雨情况)。我的敞篷车只有在侧窗降下时才会淋湿。:-)在西雅图,了解夏天的小雨是很有用的。你似乎有很多期望,但是你首先应该期望的是不超过或低于你实际要求的;)也许英语不是你最好的语言,这也没什么错(我为你愿意使用英语而喝彩),但你需要明白,当你的交流含糊不清或不是你真正想要的东西时,你的期望不会得到满足。撇开无关的评论不谈,@BenjaminLindley的回答包括三个有效的备选方案,您目前还没有排除它们。@revani-您提供的第二个链接纯粹是一个链接
std::cerr << str;
std::clog << str;
#include <unistd.h>
#include <stdio.h>

int main()
  {
  const char x[] = "Hello World!";
  write(STDOUT_FILENO, x, strlen(x)); // Feel free to check the return value.
  return 0;
  }