sizeof()运算符在C++中的作用
what is sizeof() operator doing in C++
C中的sizeof()
运算符在编译时给出其操作数的大小。它不计算其操作数。例如,
int ar1[10];
sizeof(ar1) // output 40=10*4
sizeof(ar1[-1]) // output 4
int ar2[ sizeof(ar1) ]; // generate an array of 40 ints.
当谈到C++模板类时,我发现了一些奇怪的结果。
template<typename T>
struct S{
T a;
};
sizeof( S<int> ) // output 4
sizeof( S<bool> ) // output 1
sizeof( vector<int> ) // output 24
sizeof( vector<char> ) // output 24
sizeof( vector<bool> ) // output 40
我猜向量或其他STL容器上的sizeof
取决于特定的环境。
问题1.sizeof
是如何在C/C++中实现的?它不能是运行时函数。它是一个宏吗?(我在视频在线教程中学到的(。如果它是宏,它的#define
是什么样子的?sizeof()
何时执行?
问题2.如果我将成员方法void f(){}
添加到struct S
的定义中。sizeof(S<int>)
仍然是4。结构的大小不应该增加吗?
问题3.STL容器是模板类。以vector
为例,它有12个成员属性/类型和许多成员方法?sizeof( S<int> )
的输出很容易解释。但我发现很难解释sizeof( vector<int> )
的输出。模板类应在编译时实例化,编译器应完全了解类的大小,即vector<int>
。所以sizeof()
操作员应该知道。
根据问题1:sizeof
由编译器实现和评估。它不是一个宏,它总是提供编译时的结果。从概念上讲,您可以想象编译器用一个数字替换每个sizeof
。
根据问题2:sizeof
统计S
的一个实例占用的存储量。方法不占用每个实例的存储空间,只有字段占用(因为它们每个实例存在一次(。然而,一个方法确实占用了某个地方的静态存储空间来保存函数的机器代码。
根据问题3:对于sizeof(vector<int>)
,编译器计算vector<int>
的大小,并实例化该大小。如果您因为vector
可以是可变大小而感到困惑:这是真的,但额外的存储是从堆中分配的,因此不会反映在sizeof
应用于vector
的结果中。
-
sizeof
不是宏。它是一个内置运算符,生成一个常量表达式,因此可以想象编译器在编译时只是用一个值为对象或类操作数大小的文字来替换它。 -
函数不会占用对象内部的空间。函数的代码没有存储在对象内部。
-
容器(如
std::vector<int>
(的大小是向量成员占用的内存量,加上一些实现定义的填充。它不包括向量通过持有指针"拥有"的任何内存。(请注意,向量的元素是而不是成员——当我说成员时,我指的是在std::vector
类的定义中声明的成员。(因此,它与向量中有多少元素无关。
- 我的神经网络不起作用 [XOR 问题]
- 在C++程序中输入的文本文件将不起作用,除非文本被复制和粘贴
- 未在作用域中声明unordered_map
- C++映射:具有自定义类的运算符[]不起作用(总是返回0)
- C++为什么尽管我调用了void函数,它却不起作用
- 为什么在保护模式下继承升级不起作用
- 循环在计数器中不起作用
- 有没有一种方法可以在编译时获得作用域类名
- 在其他文件中创建类时在 c++ 项目中不起作用
- Visual studio代码重构似乎不起作用(例如,重命名符号-f2)
- 为什么二进制搜索在我的测试中不起作用
- C++quit()函数中可能存在作用域问题
- 我的代码中有错误吗?使用BGI图形的C++代码对我不起作用
- 为什么 const std::p air<K,V>& 在 std::map 上基于范围的 for 循环不起作用?
- 带有指定长度字符* 参数的 std::regex_search 在 VS2017 中不起作用?
- "using namespace std;"在C++的作用是什么?
- Bjarne Stroustrup Book - std_lib_facilities.h - 不起作用(未知类型名称)
- 为什么简单的算术减法在"if"条件下不起作用?
- 为什么Stroustup书中的has_f不起作用
- 未在此作用域OpenCV3.4中声明cvSaveImage