C++中的STD是啥?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++中的STD是啥?相关的知识,希望对你有一定的参考价值。

性传播疾病;性病;标准;标准差;挂起到硬盘。
22%hadsufferedfromSTDinthepastoneyear.22%的调查对象近1a患过性传播疾病。
std英文缩写,根据不同的全称解释有不同的意思。
STD是指可以通过性接触而传播的疾病,也就是性传播疾病。性传播疾病可以包括各种病原体的感染,比如细菌、螺旋体、衣原体、病毒、原虫、真菌、寄生虫等。一站式出国留学攻略 http://www.offercoming.com
参考技术A 在标准C++以前,都是用#include<iostream.h>这样的写法的,因为要包含进来的头文件名就是iostream.h。标准C++引入了名字空间的概念,并把iostream等标准库中的东东封装到了std名字空间中,同时为了不与原来的头文件混淆,规定标准C++使用一套新的头文件,这套头文件的文件名后不加.h扩展名,如iostream、string等等,并且把原来C标准库的头文件也重新命名,如原来的string.h就改成cstring(就是把.h去掉,前面加上字母c),所以头文件包含的写法也就变成了#include <iostream>。
并不是写了#include<iostream>就必须用using namespace std;我们通常这样的写的原因是为了一下子把std名字空间的东东全部暴露到全局域中(就像是直接包含了iostream.h这种没有名字空间的头文件一样),使标准C++库用起来与传统的iostream.h一样方便。如果不用using namespace std;使用标准库时就得时时带上名字空间的全名,如std::cout << "hello" << std::endl;
#include "iostream"与#include<iostream>的区别:前者先在当前目录找iostream文件,找不到再去系统头文件路径找,后者反之。因此,做为一个良好的习惯,在包含系统头文件时尽量用<>,而在包含自己的工程中的头文件时用""。
参考技术B C++使用名称空间(namespace)来避免命名冲突,在不同的名称空间里的同名变量、函数和类将不会引发命名冲突,这有点类似于Java里的包(package),std是C++标准库中的一个名称空间,里面包含大部分C++标准类的声明 参考技术C 我们使用appwizard自动生成某些项目时,系统会自动把所需要include的头文件在stdafx.h中先include一下,这样我们只需要直接include这个stdafx.h文件即可。因为同一个项目中的不同源文件cpp都包含相同的include文件,这样为每个cpp文件都重复include这些文件就显得很傻了。 具体在stdafx.h中需要include什么头文件,取决于用户在appwizard中的选择。比如:#include <afxwin.h> //MFC core and standard components#include <afxext.h> //MFC extensions.......这样就方便多了,所以stdafx.h时自动生成的。这就使得用户在开发中不必在每个cpp文件中都繁琐的include头文件了,而且维护起来也方便。在生成stdafx.h头文件的同时,也生成stdafx.cpp源文件,该源文件只包含#include "stdafx.h"语句,这是在编译过程中第一个被编译的文件,编译的结果保存在一个名为stdafx.pch的文件里.(扩展名pch表示预编译头文件.)当visual c++编译随后的每个.cpp文件时,它阅读并使用它刚生成的pch文件.visual c++不再分析windows include 文件,除非用户又编辑了stdafx.h或者stdafx.cpp。看了这样的讲解,我马上就实验了一下,自己新建立的一个windows窗口项目,就生成了stdafx.h和stdafx.cpp。并且,在主源文件中,就cinlude此头文件stdafx.h。以上情况,只在使用appwizard来自动生成项目的时候,才出现,否则,就没有必要include此头文件stdafx.h了。补充:standard application frame extendstdafx.h中没有函数库,只是定义了一些环境参数,使得编译出来的程序能在32位的操作系统环境下运行。
  Windows和MFC的include文件都非常大,即使有一个快速的处理程序,编译程序也要花费相当长的时间来完成工作。由于每个.CPP文件都包含相同的include文件,为每个.CPP文件都重复处理这些文件就显得很傻了。
  为避免这种浪费,AppWizard和VisualC++编译程序一起进行工作,如下所示:
  ◎AppWizard建立了文件stdafx.h,该文件包含了所有当前工程文件需要的MFCinclude文件。且这一文件可以随被选择的选项而变化。
  ◎AppWizard然后就建立stdafx.cpp。这个文件通常都是一样的。
  ◎然后AppWizard就建立起工程文件,这样第一个被编译的文件就是stdafx.cpp。
  ◎当VisualC++编译stdafx.cpp文件时,它将结果保存在一个名为stdafx.pch的文件里。(扩展名pch表示预编译头文件。)
  ◎当VisualC++编译随后的每个.cpp文件时,它阅读并使用它刚生成的.pch文件。VisualC++不再分析Windowsinclude文件,除非你又编辑了stdafx.cpp或stdafx.h。
  这个技术很精巧,你不这么认为吗?(还要说一句,Microsoft并非是首先采用这种技术的公司,Borland才是。)在这个过程中你必须遵守以下规则:
  ◎你编写的任何.cpp文件都必须首先包含stdafx.h。
  ◎如果你有工程文件里的大多数.cpp文件需要.h文件,顺便将它们加在stdafx.h(后部)上,然后预编译stdafx.cpp。
  ◎由于.pch文件具有大量的符号信息,它是你的工程文件里最大的文件。
  如果你的磁盘空间有限,你就希望能将这个你从没使用过的工程文件中的.pch文件删除。执行程序时并不需要它们,且随着工程文件的重新建立,它们也自动地重新建立
参考技术D standard,标准的意思C++标准模板库的内容全都在这个空间中

我的 gprof 输出中的这些 c++ std 函数是啥,它们需要花费大量时间?

【中文标题】我的 gprof 输出中的这些 c++ std 函数是啥,它们需要花费大量时间?【英文标题】:What are these c++ std functions in my gprof output which are taking quite a lot of time?我的 gprof 输出中的这些 c++ std 函数是什么,它们需要花费大量时间? 【发布时间】:2020-04-25 14:55:53 【问题描述】:

gprof 输出。我在我的代码中使用了双端队列,std::vectorstd::move

Flat profile:

Each sample counts as 0.01 seconds.
  %   cumulative   self              self     total           
 time   seconds   seconds    calls   s/call   s/call  name    
 10.70      0.78     0.78 411724776     0.00     0.00  __gnu_cxx::__normal_iterator<int*, std::vector<int, std::allocator<int> > >::operator*() const
  5.97      1.22     0.44 114087996     0.00     0.00  __gnu_cxx::__normal_iterator<int*, std::vector<int, std::allocator<int> > >::operator--()
  5.90      1.65     0.43 256602502     0.00     0.00  __gnu_cxx::__normal_iterator<int*, std::vector<int, std::allocator<int> > >::base() const
  5.90      2.08     0.43 197352626     0.00     0.00  std::remove_reference<int&>::type&& std::move<int&>(int&)
  5.76      2.50     0.42    20556     0.00     0.00  void std::__move_merge_adaptive<int*, __gnu_cxx::__normal_iterator<int*, std::vector<int, std::allocator<int> > >, __gnu_cxx::__normal_iterator<int*, std::vector<int, std::allocator<int> > >, __gnu_cxx::__ops::_Iter_less_iter>(int*, int*, __gnu_cxx::__normal_iterator<int*, std::vector<int, std::allocator<int> > >, __gnu_cxx::__normal_iterator<int*, std::vector<int, std::allocator<int> > >, __gnu_cxx::__normal_iterator<int*, std::vector<int, std::allocator<int> > >, __gnu_cxx::__ops::_Iter_less_iter)
  5.49      2.90     0.40 139505351     0.00     0.00  __gnu_cxx::__normal_iterator<int*, std::vector<int, std::allocator<int> > >::operator++()

【问题讨论】:

你在编译优化吗? 好吧,我做到了,所有这些功能都从 gprof 输出中消失了。怎么样? 【参考方案1】:

这些函数是标准库的实现细节。既然你在分析,你想在编译器中启用优化,否则编译器基本上不会注意试图让你的程序运行得很快,它只是想让它易于调试。启用优化后,您应该会看到这些函数消失,因为编译器意识到它们可以被内联,从而消除了函数调用开销。

【讨论】:

实际上我确实启用了优化并且那些函数调用消失了。【参考方案2】:

我希望 Vaughn 是对的,但根据我的经验,它并不总是有效。事实上,据我所见,它几乎永远不会奏效。由于在调试构建中您无法看到该代码,因此程序员倾向于假设这些东西是内联的,而实际上它们可能不是内联的。一种检查方法是在其他 DEBUG 构建中打开优化,并检查生成的反汇编代码。

编译器通常无法判断程序员的意图,因此它会坚持安全的内容。例如,程序员可能知道数组索引在数组边界内甚至是常量,但这并不意味着编译器可以弄清楚。

这是您使用标准库模板时的问题。 我知道鼓励人们使用它们是因为他们发现了初级编程错误,但您为它们付出的代价并没有消失。

【讨论】:

以上是关于C++中的STD是啥?的主要内容,如果未能解决你的问题,请参考以下文章

c++中的引用范围是啥? [复制]

C++ 中的“minmax.h”是啥?

在 C++ 中的两个线程之间同步变量的正确方法是啥?

这个 C++ 错误 std::length_error 是啥意思

双冒号是啥意思?

C语言的cout是啥意思?