ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

扩展2

2020-06-26 23:02:35  阅读:278  来源: 互联网

标签:网段 报文 扩展 MAC 地址 && forward


1、宏定义

#define:写法为#define 标识符(形参) 字符串,作用是定义标识符为字符串。
#if、#else、#endif、#elif:和去掉#意思差不多,只是最后一定要加#endif
#ifdef:如果后面的宏定义了,那么编译
#ifndef:如果后面的宏没有定义,那么编译
#undef:取消宏

2、详细Ping过程描述/二层转发三层转发

主机A建立一个ICMP回显请求报文,和主机B的IP地址发送给IP层,构建一个IP数据包。然后要获得MAC地址(二、三层转发):

1.同一网段:
主机A要ping主机B,先判断一下是不是处于同一网段(掩码),发现是同一网段。然后查MAC地址表,发现没有B的MAC地址,那么向外发送ARP广播。交换机收到报文后,学习A的地址,看一下有没有B的MAC地址,有就发给A;没有就向所有端口发送ARP广播。非主机B收到报文后会丢弃,主机B收到报文后学习A的MAC地址,然后发送ARP回应报文告诉A自己的MAC地址。A收到后学习B的MAC地址。

2.不同网段:
先判断一下是不是处于同一网段,发现不是同一网段。主机A找网关转发。如果不知道网关MAC地址,那么就同上进行ARP广播,得到网关MAC地址。然后发送ICMP请求报文给网关路由器。网关收到后,查找路由表,确定发出去的端口,看一下目标IP是不是在同一网段,是的找到B的MAC地址转发过去(找不到ARP广播一下);不是的话,使用下一跳的IP地址查ARP表,发到下一跳。

主机B收到报文,返回ICMP回显应答报文。
用到的协议主要有:DNS(域名转地址),UDP(DNS协议使用),IP,ARP。

3、O(1)插入,删除,随机等概率获取数

不能重复元素使用:
使用vector存数字,用unordered_map<int, int>记录每个值在vector的索引。这样插入和随机都能O(1)了。删除的时候,把要删除的数和末尾交换,然后pop_back()。

可重复:
,用unordered_map<int, vector>记录每个值在vector的索引。

4、虚函数表在哪?

Linux/Unix放在只读数据段,Windows放在常量段。

5、再谈右值引用作用

之前看的已经忘了...、

右值引用是C++11为了实现移动操作而引入的新的引用类型
作用:

  1. 实现移动语义,也就是move(),move就是把左值强制转换为右值引用。为了避免了拷贝带来的开销(构造析构等等),直接把所有权进行移动,移完之后原来的变量失去对值的控制。比如unique_ptr的所有权移动需要使用move。
    实现为static_cast静态强制转换。
  2. 实现完美转发,也就是forward(),在传递参数的时候保留其左右值属性。通常情况下,函数内部对一个参数都是以左值使用的,所以需要forward<>()进行一个完美转发。

6、std::move和std::forward

move:
使用static_cast把左值(右值)变成一个右值引用。

template <typename T>
typename remove_reference<T>::type&& move(T&& t)
{
	return static_cast<typename remove_reference<T>::type&&>(t);
}

forward:
需要了解一点引用折叠的知识。

template<class _Ty>
	_NODISCARD constexpr _Ty&& forward(remove_reference_t<_Ty>& _Arg) noexcept
	{	// forward an lvalue as either an lvalue or an rvalue
	return (static_cast<_Ty&&>(_Arg));
	}

template<class _Ty>
	_NODISCARD constexpr _Ty&& forward(remove_reference_t<_Ty>&& _Arg) noexcept
	{	// forward an rvalue as an rvalue
	static_assert(!is_lvalue_reference_v<_Ty>, "bad forward call");
	return (static_cast<_Ty&&>(_Arg));
	}

7、引用折叠

即推导类似T& &&,T&& &&的类型。
规则为:只有右值引用折叠到右值引用才为右值引用,其他折叠均为左值引用,即T&& &&=T&&,其余T& &&/T&& &/T& &=T&。

8、同一时间只打开一个程序

参考资料

详细Ping过程描述(二、三层转发)
C++11尝鲜:std::move和std::forward源码分析
引用折叠和完美转发

标签:网段,报文,扩展,MAC,地址,&&,forward
来源: https://www.cnblogs.com/KirinSB/p/12961966.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有