C++年如何长期实施

How is long long implemented in C++?

本文关键字:何长期 C++      更新时间:2023-10-16

据我所知,C++中,所有数据类型都是作为类实现的。(不知道它是否正确,但我将其视为诸如 int a(5); 之类的语句的理由,它调用了 int 的参数化构造函数。

如果是这样,如何实施多头和空头?我刚刚发现long longshort short是有效的类型,但short longlong short不是(检查后者只是因为它听起来很有趣!

同样,如何实现已签名和未签名?

附言。通过实现,我的意思是"是使用 C/C++ 功能编写的,还是在编译器本身的较低级别编写的"。


因此,基本类型的变量和用户定义的对象或变量的声明的等效部分是(向下读取(

auto|register|static|extern           <=>   auto|register|static|extern
const                                 <=>   const
(signed|unsigned)(long|short)datatype <=>   class name etc
variable name                         <=>   object/variable name

?这种说法正确吗?

在特定问题上,long long由编译器以编译器 + 平台特定的方式实现(通常比编译器依赖的平台更多(。

至于最初的误解,不,并非所有类型都是C++类。这些语言试图尽可能为所有类型提供统一的语法,试图让所有类型尽可能相似地表现,并以类似的方式使用。事实上,它实际上是相反的:C++尽可能多地尝试让类的行为像原始类型(值语义(。

能够以这种方式初始化整数的特定原因实际上与类非常相关,只是方式不同。在类构造函数定义中,有一些初始值设定项列表,用于定义在执行构造函数块之前如何初始化每个成员。列表中每个初始值设定项元素的语法基本上是(我必须查找确切的定义(:member_name( initializer ) ,因此例如您会得到:

class my_int_vector {
   int * p;
   int size; 
public:
   my_int_vector() : p(0), size(0) {}
//...
}

指针和整数都是基本类型,但它们可以用类似于类的方式初始化。如果基本类型不允许这种类型的初始化,并且只允许type name = value;语法,则必须扩展初始值设定项列表语法,并且以后将无法无缝更改这些类型(例如,将int更改为atomic_int(。

内置数据类型不作为类实现。它们只是在语法上有一些相似之处。

shortlongint和所有其他内置类型名称都是编译器特别处理的关键字。所以,简而言之,它们被实现为魔法。他们不是阶级,他们只是他们自己。

所以不,这些类型不能像std::string或其他标准库组件那样以其他语言功能实现。内置类型是核心语言的基本部分。

并非所有数据类型都是C++中的类。原始 C 数据类型不是(它们称为标量(。它们根本没有被"实现",而是形成了直接翻译成机器代码的语言的核心功能。语法int i(5);等效于 C 的int i = 5;,并在声明时初始化变量。

你正在一些误解下工作:

  • 并非所有数据类型都作为类实现C++。 实际上,只有类类型被实现为类。 除了基本类型之外,枚举、指针和数组不作为类实现。

  • short short不是有效的类型。 中的有符号整数类型C++03 是signed charshortintlong。 时期。 C++11添加long long ,并允许实现添加其他内容。

  • 我不确定你在这里所说的"实施"是什么意思。 在几乎所有现代机器上,硬件直接支持所有整数类型(有符号或无符号(;C++编译器仅生成相应的硬件指令。 (在较旧的机器上,long,有时甚至是intshort,通常需要函数调用才能进行基本操作,而在一些罕见和奇特的机器上,无符号算术需要额外的指令。

  • 如何编写定义是一个语法问题,而不是实现问题。 如果类型支持 copy,则T v(i);T v = i;都是合法的;对于除类类型之外的所有类型,它们都是完全相同的。 (使用现代编译器;我过去使用过一些在这方面有错误的编译器。 但那是相当遥远的过去。