<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>Optimization on Cassius0924 的博客</title>
    <link>https://blog.cassdev.com/tags/optimization/</link>
    <description>Recent content in Optimization on Cassius0924 的博客</description>
    <generator>Hugo -- 0.148.2</generator>
    <language>zh-CN</language>
    <copyright>Copyright © 2025-2025 Cassius0924. All rights reserved.</copyright>
    <lastBuildDate>Thu, 27 Jun 2024 20:12:42 +0800</lastBuildDate>
    <atom:link href="https://blog.cassdev.com/tags/optimization/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>HTTP 协议版本变化学习笔记</title>
      <link>https://blog.cassdev.com/posts/http-%E5%8D%8F%E8%AE%AE%E7%89%88%E6%9C%AC%E5%8F%98%E5%8C%96%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/</link>
      <pubDate>Thu, 27 Jun 2024 20:12:42 +0800</pubDate>
      <guid>https://blog.cassdev.com/posts/http-%E5%8D%8F%E8%AE%AE%E7%89%88%E6%9C%AC%E5%8F%98%E5%8C%96%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/</guid>
      <description>&lt;p&gt;互联网发展至今，HTTP 协议已经发展了多个版本，分别为 &lt;code&gt;HTTP/1.0&lt;/code&gt;、&lt;code&gt;HTTP/1.1&lt;/code&gt;、&lt;code&gt;HTTP/2.0&lt;/code&gt;、&lt;code&gt;HTTP/3.0&lt;/code&gt;，本文将对这几个版本的变化进行学习笔记。&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;HTTP 协议层&#34; loading=&#34;lazy&#34; src=&#34;https://s2.loli.net/2024/06/27/6KE87inXyFe4DbW.png&#34;&gt;&lt;/p&gt;
&lt;h2 id=&#34;http10&#34;&gt;HTTP/1.0&lt;/h2&gt;&lt;p&gt;HTTP/1.0 是最早的 HTTP 协议版本，它的特点是：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;每次请求都会建立一个新的 TCP 连接，请求结束后立即断开连接。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;每个请求都会包含完整的请求头和请求体。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;不支持持久连接，每次请求都需要重新建立连接。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;不支持管道化，即同一个连接中不能同时发送多个请求。&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;http11&#34;&gt;HTTP/1.1&lt;/h2&gt;&lt;p&gt;HTTP/1.1 是对 HTTP/1.0 的改进，它的特点是：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;支持持久连接（Keep-Alive），即同一个连接可以发送多个请求。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;支持管道化，即同一个连接中可以同时发送多个请求。但是，由于 HTTP/1.1 中的管道化存在队头阻塞问题，所以很少被使用。默认为关闭状态，并且大多数浏览器也不支持。 &lt;strong&gt;所以我们认为 HTTP/1.1 不支持管道化&lt;/strong&gt; 。&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;HTTP/1.1 的缺点：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;队头阻塞问题：如果一个请求响应时间过长，那么后面的请求就会被阻塞。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;明文传输：HTTP/1.1 的数据传输是纯文本且未加密的，容易被窃听。比如状态码 &lt;code&gt;200&lt;/code&gt; 会被分为 &lt;code&gt;2&lt;/code&gt;、&lt;code&gt;0&lt;/code&gt;、&lt;code&gt;0&lt;/code&gt; 三个字节传输。这点会在 HTTP/2.0 中得到改进。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;头部冗余：每次请求都需要携带完整的请求头，头部信息冗余。&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34;&gt;&lt;/p&gt;
&lt;h2 id=&#34;https&#34;&gt;HTTPS&lt;/h2&gt;&lt;p&gt;在讲述 HTTP/2.0 之前，我们先来了解一下 HTTPS。&lt;/p&gt;
&lt;p&gt;HTTPS 是在 HTTP 的基础上加入了 SSL/TLS 加密层，使得数据传输更加安全。HTTPS 的特点是：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;数据加密：HTTPS 使用 SSL/TLS 加密传输数据，保证数据传输的安全性。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;身份认证：HTTPS 使用证书机制对服务器和客户端进行身份认证，防止中间人攻击。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;数据完整性：HTTPS 使用数字签名对数据进行完整性校验，防止数据被篡改。&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;加密方式：对称加密、非对称加密、数字签名。&lt;/p&gt;
&lt;p&gt;通信前使用非对称加密协商对称加密的密钥，通信过程使用对称加密传输数据，保证数据传输的安全性。&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;HTTPS&#34; loading=&#34;lazy&#34; src=&#34;https://s2.loli.net/2024/06/27/wcztbDYBevjP26L.png&#34;&gt;&lt;/p&gt;
&lt;h2 id=&#34;http20&#34;&gt;HTTP/2.0&lt;/h2&gt;&lt;p&gt;HTTP/2.0 是对 HTTP/1.1 的重大升级，它的特点是：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;头部压缩：HTTP/2.0 使用 HPACK 算法对头部进行压缩，如果请求头中包含相同的字段，只需要发送一次，后续请求只需要发送索引，接着从静态表或动态表中获取对应的值。解决了 HTTP/1.1 中头部冗余的问题。&lt;/p&gt;</description>
    </item>
    <item>
      <title>C&#43;&#43; 中位运算的妙用：与运算和或运算的合并标志位</title>
      <link>https://blog.cassdev.com/posts/c&#43;&#43;-%E4%B8%AD%E4%BD%8D%E8%BF%90%E7%AE%97%E7%9A%84%E5%A6%99%E7%94%A8%E4%B8%8E%E8%BF%90%E7%AE%97%E5%92%8C%E6%88%96%E8%BF%90%E7%AE%97%E7%9A%84%E5%90%88%E5%B9%B6%E6%A0%87%E5%BF%97%E4%BD%8D/</link>
      <pubDate>Sun, 16 Jun 2024 11:20:31 +0800</pubDate>
      <guid>https://blog.cassdev.com/posts/c&#43;&#43;-%E4%B8%AD%E4%BD%8D%E8%BF%90%E7%AE%97%E7%9A%84%E5%A6%99%E7%94%A8%E4%B8%8E%E8%BF%90%E7%AE%97%E5%92%8C%E6%88%96%E8%BF%90%E7%AE%97%E7%9A%84%E5%90%88%E5%B9%B6%E6%A0%87%E5%BF%97%E4%BD%8D/</guid>
      <description>&lt;p&gt;当我们处理程序中的多个标志位时，将它们合并成一个整数是一种常见的技巧。这种做法不仅有助于提高代码的可读性，还使得对多个标志位进行操作更为方便。&lt;/p&gt;
&lt;p&gt;在C++中，可以使用按位或（&lt;code&gt;|&lt;/code&gt;）运算符来实现这一功能。&lt;/p&gt;
&lt;h2 id=&#34;合并标志位的基本思想&#34;&gt;合并标志位的基本思想&lt;/h2&gt;&lt;p&gt;在C++中，合并标志位的基本思想是将多个标志位的二进制表示中的相应位进行按位或运算，形成一个包含所有标志位信息的整数。这样，就能够用一个整数表示多个不同的状态或选项。&lt;/p&gt;
&lt;h2 id=&#34;代码示例&#34;&gt;代码示例&lt;/h2&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-cpp&#34; data-lang=&#34;cpp&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cp&#34;&gt;#include&lt;/span&gt; &lt;span class=&#34;cpf&#34;&gt;&amp;lt;iostream&amp;gt;&lt;/span&gt;&lt;span class=&#34;cp&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cp&#34;&gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kt&#34;&gt;int&lt;/span&gt; &lt;span class=&#34;nf&#34;&gt;main&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;c1&#34;&gt;// 定义三个标志位
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;&lt;/span&gt;    &lt;span class=&#34;k&#34;&gt;const&lt;/span&gt; &lt;span class=&#34;kt&#34;&gt;int&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;FLAG_A&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;mb&#34;&gt;0b0001&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;const&lt;/span&gt; &lt;span class=&#34;kt&#34;&gt;int&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;FLAG_B&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;mb&#34;&gt;0b0010&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;const&lt;/span&gt; &lt;span class=&#34;kt&#34;&gt;int&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;FLAG_C&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;mb&#34;&gt;0b0100&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;c1&#34;&gt;// 合并标志位
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;&lt;/span&gt;    &lt;span class=&#34;kt&#34;&gt;int&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;flags&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;FLAG_A&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;|&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;FLAG_C&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;c1&#34;&gt;// 检查是否设置了某个标志位
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;&lt;/span&gt;    &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;flags&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;&amp;amp;&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;FLAG_A&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;		&lt;span class=&#34;c1&#34;&gt;// True
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;&lt;/span&gt;        &lt;span class=&#34;n&#34;&gt;std&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;::&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;cout&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;&amp;#34;FLAG_A is set.&amp;#34;&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;std&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;::&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;endl&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;flags&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;&amp;amp;&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;FLAG_B&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;		&lt;span class=&#34;c1&#34;&gt;// False
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;&lt;/span&gt;        &lt;span class=&#34;n&#34;&gt;std&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;::&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;cout&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;&amp;#34;FLAG_B is set.&amp;#34;&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;std&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;::&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;endl&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;flags&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;&amp;amp;&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;FLAG_C&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;		&lt;span class=&#34;c1&#34;&gt;// True
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;&lt;/span&gt;        &lt;span class=&#34;n&#34;&gt;std&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;::&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;cout&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;&amp;#34;FLAG_C is set.&amp;#34;&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;std&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;::&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;endl&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;在这个示例中，首先定义了三个标志位 &lt;code&gt;FLAG_A&lt;/code&gt;、&lt;code&gt;FLAG_B&lt;/code&gt; 和 &lt;code&gt;FLAG_C&lt;/code&gt;，它们分别对应二进制的 &lt;code&gt;0001&lt;/code&gt;、&lt;code&gt;0010&lt;/code&gt; 和 &lt;code&gt;0100&lt;/code&gt;。然后，使用 &lt;code&gt;|&lt;/code&gt; 运算符将 &lt;code&gt;FLAG_A&lt;/code&gt; 和 &lt;code&gt;FLAG_C&lt;/code&gt; 合并成 &lt;code&gt;flags&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;接下来，使用按位与运算符 &lt;code&gt;&amp;amp;&lt;/code&gt; 来检查 &lt;code&gt;flags&lt;/code&gt; 中是否设置了每个标志位。如果某个标志位被设置，相应的条件语句将会执行。&lt;/p&gt;
&lt;h2 id=&#34;优点与用途&#34;&gt;优点与用途&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;可读性提高：&lt;/strong&gt; 将多个标志位合并成一个整数可以提高代码的可读性。通过使用有意义的常量名称，可以更清晰地了解整数表示的含义。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;便于操作：&lt;/strong&gt; 合并后的整数可以方便地进行各种按位操作，如按位与、按位或等，而无需单独处理每个标志位。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;节省内存：&lt;/strong&gt; 在某些情况下，将多个标志位合并成一个整数可能节省内存，特别是当标志位数量较多时。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;在实际编码中，合并标志位是一种常见的编程技巧，适用于需要处理多个二进制状态的情况。这种技术不仅简化了代码，还使得代码更易维护和扩展。&lt;/p&gt;</description>
    </item>
  </channel>
</rss>
