php 网站部署后乱码,大连网站建设培训,怎么制作微信表情包,知名做网站价格一#xff1a;背景 最近发现 C 中的类型初始化操作#xff0c;没有 {} 运算符搞不定的#xff0c;蛮有意思#xff0c;今天我们就来逐一列一下各自的用法以及汇编展现#xff0c;本来想分为 值类型 和 引用类型 两大块#xff0c;但发现在 C 中没这种说法#xff0c;默认… 一背景 最近发现 C 中的类型初始化操作没有 {} 运算符搞不定的蛮有意思今天我们就来逐一列一下各自的用法以及汇编展现本来想分为 值类型 和 引用类型 两大块但发现在 C 中没这种说法默认都是 值类型 二各种玩法一览 1. int 上的初始化首先看一下代码int main()
{int i { 10 };int j{ 10 };printf(i%d, j%d, i, j);
}相比C#来说不带 的写法感觉还是怪怪的。。。接下来看下对应的汇编代码。int i { 10 };
00021825 mov dword ptr [ebp-8],0Ah int j{ 10 };
0002182C mov dword ptr [ebp-14h],0Ah从汇编代码看就是一个简单的 栈赋值 所以在 int 上用 {} 完全没必要太伤键盘了。2. 数组的初始化继续看例子。int main()
{int num[] { 10,11,12 };
}这种写法中规中矩基本上 C 系列的语言都这样对于玩 C# 的我来说不陌生。。。不过人家默认是值类型C# 是引用类型从汇编代码中也能看的出来。int num[] { 10,11,12 };
009C1E95 mov dword ptr [ebp-10h],0Ah
009C1E9C mov dword ptr [ebp-0Ch],0Bh
009C1EA3 mov dword ptr [ebp-8],0Ch3. 结构体的初始化结构体大家都很熟悉直接上代码了。typedef struct _Point
{int x;int y;
} Point;int main()
{Point point { 10,20 };
}接下来看一下汇编代码。Point point { 10,20 };
00481825 mov dword ptr [ebp-0Ch],0Ah
0048182C mov dword ptr [ebp-8],14h可以看到其实也是一组简单的赋值操作很方便。4. 类的初始化方便讲述先上代码class Location {
private:int x;int y;int z;
public:Location(int x, int y, int z) :x(x), y(y), z(z) {}
};int main()
{Location location { 10,11,12 };
}接下来看下汇编代码是不是调用了 Location 的构造函数。Location location { 10,11,12 };
008D183F push 0Ch
008D1841 push 0Bh
008D1843 push 0Ah
008D1845 lea ecx,[ebp-14h]
008D1848 call Location::Location (08D13A7h)可以看到确实调用了 构造函数那个 ecx 就是 location 的 this 指针。5. initializer_list 模板类C 中的 initializer_list 类可以接收 {} 初始化语法作为初始化操作这个有一点像 C# 的 param 可选参数接下来把上例的中构造函数改成 initializer_list 来接收代码如下class Location {
public:int x;int y;int z;
public:Location(initializer_listint list) {x *(const_castint*(list.begin()));y *(const_castint*(list.begin() 1));z *(const_castint*(list.begin() 2));}
};int main()
{Location loc { 10,11,12 };printf(loc.x%d,loc.y%d,loc.z%d, loc.x, loc.y, loc.z);
}接下来看下汇编代码。Location loc { 10,11,12 };
00B9518F mov dword ptr [ebp-0F8h],0Ah
00B95199 mov dword ptr [ebp-0F4h],0Bh
00B951A3 mov dword ptr [ebp-0F0h],0Ch
00B951AD lea eax,[ebp-0ECh]
00B951B3 push eax
00B951B4 lea ecx,[ebp-0F8h]
00B951BA push ecx
00B951BB lea ecx,[ebp-0E4h]
00B951C1 call std::initializer_listint::initializer_listint (0B913C5h)
00B951C6 mov edx,dword ptr [eax4]
00B951C9 push edx
00B951CA mov eax,dword ptr [eax]
00B951CC push eax
00B951CD lea ecx,[loc]
00B951D0 call Location::Location (0B913ACh)从汇编代码看它首先做了 initializer_list 的初始化操作然后将弄好的集合丢到 Location 构造函数中反转过来大概就是这样。int main()
{initializer_listint list { 10,11,12 };Location loc { list };printf(output: loc.x%d,loc.y%d,loc.z%d, loc.x, loc.y, loc.z);
}哈哈是不是感觉 {} 在初始化方面无所不能好了本篇就聊到这里了。