<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>WebAssembly 3.0 新特性详解:多线程、SIMD与内存管理优化</title>
<link href="https://fonts.googleapis.com/css2?family=Noto+Sans+SC:wght@300;400;500;700;900&display=swap" rel="stylesheet">
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@fortawesome/fontawesome-free@6.4.0/css/all.min.css">
<link href="https://cdn.jsdelivr.net/npm/tailwindcss@2.2.19/dist/tailwind.min.css" rel="stylesheet">
<style>
:root {
--primary: #4F46E5;
--primary-dark: #4338CA;
--secondary: #818CF8;
--accent: #FBBF24;
--dark: #1F2937;
--light: #F9FAFB;
--code-bg: #1E293B;
--code-text: #E2E8F0;
}
body {
margin: 0;
padding: 0;
font-family: 'Noto Sans SC', sans-serif;
background-color: #f0f0f0;
color: var(--dark);
line-height: 1.6;
}
.poster-container {
width: 960px;
min-height: 960px;
margin: 0 auto;
background: linear-gradient(135deg, #EEF2FF, #E0E7FF);
position: relative;
overflow: hidden;
box-shadow: 0 10px 30px rgba(0, 0, 0, 0.1);
}
.poster-container::before {
content: "";
position: absolute;
top: 0;
left: 0;
right: 0;
bottom: 0;
background-image:
radial-gradient(circle at 10% 20%, rgba(79, 70, 229, 0.05) 0%, transparent 20%),
radial-gradient(circle at 90% 80%, rgba(129, 140, 248, 0.07) 0%, transparent 20%),
linear-gradient(0deg, rgba(0, 0, 0, 0.03) 1px, transparent 1px),
linear-gradient(90deg, rgba(0, 0, 0, 0.03) 1px, transparent 1px);
background-size: 300px 300px, 300px 300px, 20px 20px, 20px 20px;
z-index: 0;
}
.content {
position: relative;
z-index: 1;
padding: 40px;
}
.header {
text-align: center;
margin-bottom: 40px;
position: relative;
}
.title {
font-size: 3rem;
font-weight: 900;
margin-bottom: 10px;
background: linear-gradient(90deg, var(--primary), var(--primary-dark));
-webkit-background-clip: text;
background-clip: text;
color: transparent;
letter-spacing: -1px;
line-height: 1.1;
}
.subtitle {
font-size: 1.5rem;
font-weight: 500;
color: var(--secondary);
margin-bottom: 20px;
}
.section {
background: rgba(255, 255, 255, 0.7);
backdrop-filter: blur(10px);
border-radius: 16px;
padding: 25px;
margin-bottom: 30px;
box-shadow: 0 4px 20px rgba(0, 0, 0, 0.05);
border: 1px solid rgba(255, 255, 255, 0.5);
}
.section-title {
font-size: 1.8rem;
font-weight: 700;
margin-bottom: 15px;
color: var(--primary);
display: flex;
align-items: center;
border-bottom: 2px solid var(--secondary);
padding-bottom: 8px;
}
.section-title i {
margin-right: 10px;
color: var(--primary);
}
.feature {
display: flex;
align-items: flex-start;
margin-bottom: 25px;
padding: 15px;
border-radius: 12px;
background: rgba(255, 255, 255, 0.5);
transition: transform 0.3s ease;
}
.feature:hover {
transform: translateY(-5px);
box-shadow: 0 10px 20px rgba(0, 0, 0, 0.05);
}
.feature-icon {
background: linear-gradient(135deg, var(--primary), var(--secondary));
border-radius: 50%;
width: 60px;
height: 60px;
display: flex;
align-items: center;
justify-content: center;
margin-right: 20px;
flex-shrink: 0;
box-shadow: 0 4px 10px rgba(79, 70, 229, 0.3);
}
.feature-icon i {
font-size: 24px;
color: white;
}
.feature-content h3 {
font-size: 1.5rem;
font-weight: 700;
margin-bottom: 8px;
color: var(--primary-dark);
}
.feature-content p {
font-size: 1rem;
margin-bottom: 10px;
}
.feature-list {
padding-left: 20px;
margin: 10px 0;
}
.feature-list li {
margin-bottom: 8px;
position: relative;
padding-left: 5px;
}
.feature-list li::before {
content: "•";
color: var(--accent);
font-weight: bold;
position: absolute;
left: -15px;
}
.highlight {
color: var(--primary-dark);
font-weight: 600;
position: relative;
display: inline-block;
}
.highlight::after {
content: "";
position: absolute;
bottom: 0;
left: 0;
width: 100%;
height: 4px;
background-color: var(--accent);
border-radius: 2px;
z-index: -1;
}
.code-block {
background: var(--code-bg);
border-radius: 8px;
padding: 20px;
margin: 15px 0;
overflow-x: auto;
font-family: 'Courier New', monospace;
font-size: 0.9rem;
line-height: 1.5;
border-left: 4px solid var(--accent);
box-shadow: 0 4px 15px rgba(0, 0, 0, 0.1);
}
.code-language {
font-size: 0.8rem;
color: var(--accent);
margin-bottom: 10px;
font-weight: 600;
text-transform: uppercase;
letter-spacing: 1px;
}
.diagram {
background: rgba(255, 255, 255, 0.6);
border-radius: 12px;
padding: 20px;
margin: 20px 0;
text-align: center;
box-shadow: 0 4px 15px rgba(0, 0, 0, 0.05);
}
.diagram-title {
font-size: 1.2rem;
font-weight: 700;
margin-bottom: 15px;
color: var(--primary-dark);
}
.box {
background: linear-gradient(135deg, rgba(79, 70, 229, 0.1), rgba(129, 140, 248, 0.1));
border-radius: 8px;
padding: 12px;
margin: 8px;
display: inline-block;
text-align: center;
min-width: 120px;
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.05);
transition: transform 0.2s ease;
}
.box:hover {
transform: scale(1.05);
}
.box-title {
font-weight: 700;
margin-bottom: 5px;
font-size: 0.9rem;
color: var(--primary-dark);
}
.flow {
display: flex;
justify-content: space-between;
align-items: center;
margin: 20px 0;
flex-wrap: wrap;
}
.flow-arrow {
color: var(--secondary);
font-size: 1.5rem;
margin: 0 5px;
}
.note {
background: linear-gradient(135deg, rgba(251, 191, 36, 0.1), rgba(251, 191, 36, 0.2));
border-left: 4px solid var(--accent);
padding: 15px;
margin: 15px 0;
border-radius: 0 8px 8px 0;
}
.note-title {
font-weight: 700;
margin-bottom: 5px;
color: var(--primary-dark);
display: flex;
align-items: center;
}
.note-title i {
margin-right: 8px;
color: var(--accent);
}
.comparison {
display: flex;
justify-content: space-between;
margin: 20px 0;
flex-wrap: wrap;
}
.comparison-column {
flex: 1;
min-width: 200px;
margin: 0 10px;
}
.comparison-title {
font-size: 1.2rem;
font-weight: 700;
margin-bottom: 10px;
color: var(--primary-dark);
text-align: center;
padding-bottom: 5px;
border-bottom: 2px solid var(--secondary);
}
.comparison-item {
background: rgba(255, 255, 255, 0.6);
border-radius: 8px;
padding: 10px;
margin-bottom: 10px;
font-size: 0.9rem;
box-shadow: 0 2px 5px rgba(0, 0, 0, 0.05);
}
.application-grid {
display: grid;
grid-template-columns: repeat(2, 1fr);
gap: 15px;
margin: 20px 0;
}
.application-card {
background: linear-gradient(135deg, rgba(79, 70, 229, 0.05), rgba(129, 140, 248, 0.05));
border-radius: 12px;
padding: 15px;
text-align: center;
transition: transform 0.3s ease;
box-shadow: 0 4px 10px rgba(0, 0, 0, 0.05);
}
.application-card:hover {
transform: translateY(-5px);
box-shadow: 0 10px 20px rgba(0, 0, 0, 0.1);
}
.application-card i {
font-size: 2rem;
color: var(--primary);
margin-bottom: 10px;
}
.application-card h4 {
font-size: 1.1rem;
font-weight: 700;
color: var(--primary-dark);
margin-bottom: 5px;
}
pre {
margin: 0;
white-space: pre-wrap;
color: var(--code-text);
}
.keyword {
color: #F472B6;
}
.string {
color: #34D399;
}
.comment {
color: #94A3B8;
font-style: italic;
}
.function {
color: #60A5FA;
}
.number {
color: #FBBF24;
}
</style>
</head>
<body>
<div class="poster-container">
<div class="content">
<div class="header">
<h1 class="title">WebAssembly 3.0 新特性详解</h1>
<p class="subtitle">多线程、SIMD与内存管理优化</p>
</div>
<div class="section">
<h2 class="section-title">
<i class="fas fa-history"></i>
概述与背景
</h2>
<p>
2025年,WebAssembly(Wasm)迎来了重大更新——WebAssembly 3.0正式发布。作为Web平台的第四种语言(继HTML、CSS和JavaScript之后),WebAssembly自2017年成为W3C官方标准以来,一直在不断演进,为Web应用提供接近原生的性能。
</p>
<p>
WebAssembly是一种低级的二进制指令格式,专为在Web浏览器中高效执行代码而设计。它允许开发者使用C/C++、Rust等系统级语言编写高性能模块,并直接在浏览器中运行,从而弥补了JavaScript在某些场景下的性能瓶颈。
</p>
<p>
WebAssembly 3.0的发布标志着Web平台计算能力的又一次飞跃,特别是在多线程处理、并行计算和内存管理方面取得了重大突破,让浏览器端的计算能力迈上新台阶。
</p>
<div class="note">
<div class="note-title">
<i class="fas fa-lightbulb"></i>
为什么需要WebAssembly 3.0?
</div>
<p>随着Web应用复杂度的增加,对性能的需求也在不断提升。JavaScript虽然在不断优化,但在处理计算密集型任务时仍然存在瓶颈。WebAssembly 3.0通过引入多线程、SIMD指令集和优化的内存管理,为Web应用提供了接近原生代码的性能,使浏览器能够处理更复杂的任务,如3D渲染、视频编辑、科学计算等。</p>
</div>
</div>
<div class="section">
<h2 class="section-title">
<i class="fas fa-star"></i>
核心新特性
</h2>
<div class="feature">
<div class="feature-icon">
<i class="fas fa-network-wired"></i>
</div>
<div class="feature-content">
<h3>多线程支持</h3>
<p>
WebAssembly 3.0引入了完整的<span class="highlight">多线程编程模型</span>,允许开发者充分利用多核处理器的计算能力。通过新的WebAssembly线程API,开发者可以创建和管理多个Wasm线程,实现真正的并行计算。
</p>
<p>
多线程支持包括:
</p>
<ul class="feature-list">
<li><span class="highlight">原子操作指令集</span>,确保线程安全的数据访问</li>
<li><span class="highlight">共享内存机制</span>,允许线程间高效通信</li>
<li><span class="highlight">线程同步原语</span>,如互斥锁和条件变量</li>
<li>与Web Workers的无缝集成</li>
</ul>
<div class="code-block">
<div class="code-language">C++ (使用WebAssembly 3.0多线程特性)</div>
<pre><span class="keyword">#include</span> <span class="string"><thread></span>
<span class="keyword">#include</span> <span class="string"><vector></span>
<span class="keyword">#include</span> <span class="string"><atomic></span>
<span class="comment">// 共享数据</span>
<span class="keyword">std::atomic<int></span> counter(<span class="number">0</span>);
<span class="comment">// 线程函数</span>
<span class="keyword">void</span> <span class="function">thread_function</span>(<span class="keyword">int</span> id) {
<span class="keyword">for</span> (<span class="keyword">int</span> i = <span class="number">0</span>; i < <span class="number">1000</span>; ++i) {
<span class="comment">// 原子操作,确保线程安全</span>
counter.<span class="function">fetch_add</span>(<span class="number">1</span>, std::memory_order_relaxed);
}
}
<span class="keyword">int</span> <span class="function">main</span>() {
std::vector<std::thread> threads;
<span class="comment">// 创建多个线程</span>
<span class="keyword">for</span> (<span class="keyword">int</span> i = <span class="number">0</span>; i < <span class="number">4</span>; ++i) {
threads.<span class="function">emplace_back</span>(thread_function, i);
}
<span class="comment">// 等待所有线程完成</span>
<span class="keyword">for</span> (<span class="keyword">auto</span>& t : threads) {
t.<span class="function">join</span>();
}
<span class="keyword">return</span> counter.<span class="function">load</span>();
}</pre>
</div>
</div>
</div>
<div class="feature">
<div class="feature-icon">
<i class="fas fa-microchip"></i>
</div>
<div class="feature-content">
<h3>SIMD指令集</h3>
<p>
WebAssembly 3.0全面支持<span class="highlight">SIMD(单指令多数据)指令集</span>,使开发者能够利用现代CPU的向量处理能力。SIMD允许一条指令同时处理多个数据元素,特别适合数据并行计算场景。
</p>
<p>
SIMD指令集的主要优势:
</p>
<ul class="feature-list">
<li>显著提升数据密集型任务性能,如图像处理、音视频编解码</li>
<li>支持128位向量操作,可同时处理4个32位浮点数或8个16位整数</li>
<li>与硬件原生SIMD指令(如AVX、NEON)的高效映射</li>
<li>编译器自动向量化支持,简化开发流程</li>
</ul>
<div class="code-block">
<div class="code-language">Rust (使用WebAssembly 3.0 SIMD特性)</div>
<pre><span class="keyword">use</span> std::arch::wasm32::*;
<span class="comment">// 使用SIMD指令加速向量加法</span>
<span class="keyword">pub fn</span> <span class="function">vector_add</span>(a: &[f32], b: &[f32], result: &<span class="keyword">mut</span> [f32]) {
<span class="comment">// 确保输入长度是SIMD宽度的倍数</span>
<span class="keyword">assert!</span>(a.len() == b.len() && a.len() == result.len());
<span class="keyword">assert!</span>(a.len() % <span class="number">4</span> == <span class="number">0</span>);
<span class="comment">// 处理4个元素为一组</span>
<span class="keyword">for</span> i <span class="keyword">in</span> (<span class="number">0</span>..a.len()).<span class="function">step_by</span>(<span class="number">4</span>) {
<span class="comment">// 加载4个浮点数到SIMD寄存器</span>
<span class="keyword">let</span> va = <span class="function">v128_load</span>(a.<span class="function">as_ptr</span>().<span class="function">add</span>(i) <span class="keyword">as</span> *<span class="keyword">const</span> v128);
<span class="keyword">let</span> vb = <span class="function">v128_load</span>(b.<span class="function">as_ptr</span>().<span class="function">add</span>(i) <span class="keyword">as</span> *<span class="keyword">const</span> v128);
<span class="comment">// SIMD加法</span>
<span class="keyword">let</span> vresult = <span class="function">f32x4_add</span>(va, vb);
<span class="comment">// 存储结果</span>
<span class="function">v128_store</span>(result.<span class="function">as_mut_ptr</span>().<span class="function">add</span>(i) <span class="keyword">as</span> *<span class="keyword">mut</span> v128, vresult);
}
}</pre>
</div>
</div>
</div>
<div class="feature">
<div class="feature-icon">
<i class="fas fa-memory"></i>
</div>
<div class="feature-content">
<h3>内存管理优化</h3>
<p>
WebAssembly 3.0对内存管理进行了全面优化,提供了更高效、更灵活的内存管理机制。这些优化不仅提升了性能,还简化了开发者的内存管理负担。
</p>
<p>
内存管理优化的关键改进:
</p>
<ul class="feature-list">
<li>引入<span class="highlight">引用类型</span>,支持对外部对象(如DOM元素)的直接引用</li>
<li>内存增长机制优化,支持更高效的内存分配和释放</li>
<li>垃圾回收集成,允许Wasm与JavaScript垃圾回收器协同工作</li>
<li>内存共享机制改进,优化多线程环境下的内存访问效率</li>
</ul>
<div class="code-block">
<div class="code-language">JavaScript (加载和使用WebAssembly 3.0模块)</div>
<pre><span class="comment">// 创建共享内存</span>
<span class="keyword">const</span> sharedMemory = <span class="keyword">new</span> <span class="function">WebAssembly.Memory</span>({
initial: <span class="number">10</span>,
maximum: <span class="number">100</span>,
shared: <span class="keyword">true</span> <span class="comment">// WebAssembly 3.0新特性:共享内存</span>
});
<span class="comment">// 创建Worker</span>
<span class="keyword">const</span> worker = <span class="keyword">new</span> <span class="function">Worker</span>(<span class="string">'wasm-worker.js'</span>);
<span class="comment">// 加载WebAssembly模块</span>
<span class="function">WebAssembly.instantiateStreaming</span>(<span class="function">fetch</span>(<span class="string">'module.wasm'</span>), {
env: {
memory: sharedMemory,
<span class="comment">// 其他导入...</span>
}
}).<span class="function">then</span>(({ instance }) => {
<span class="comment">// 调用导出函数</span>
<span class="keyword">const</span> result = instance.exports.<span class="function">compute</span>();
console.<span class="function">log</span>(<span class="string">'计算结果:'</span>, result);
<span class="comment">// 与Worker通信</span>
worker.<span class="function">postMessage</span>({
command: <span class="string">'start'</span>,
memory: sharedMemory
});
});</pre>
</div>
</div>
</div>
</div>
<div class="section">
<h2 class="section-title">
<i class="fas fa-cube"></i>
基本原理和架构
</h2>
<p>
WebAssembly的核心是一个基于堆栈的虚拟机器,它使用二进制格式(.wasm文件)存储指令,而非人类可读的文本。这种设计带来了几个关键优势:高效执行、安全沙箱和跨平台兼容。
</p>
<div class="diagram">
<div class="diagram-title">WebAssembly模块结构</div>
<div class="box">Type Section<br><span class="box-title">(函数签名)</span></div>
<div class="box">Import Section<br><span class="box-title">(导入声明)</span></div>
<div class="box">Function Section<br><span class="box-title">(函数声明)</span></div>
<div class="box">Code Section<br><span class="box-title">(字节码指令)</span></div>
<div class="box">Export Section<br><span class="box-title">(导出声明)</span></div>
<div class="box">Memory Section<br><span class="box-title">(线性内存)</span></div>
</div>
<p>
WebAssembly的执行流程包括四个主要步骤:
</p>
<div class="flow">
<div class="box">获取.wasm文件</div>
<div class="flow-arrow"><i class="fas fa-arrow-right"></i></div>
<div class="box">编译</div>
<div class="flow-arrow"><i class="fas fa-arrow-right"></i></div>
<div class="box">实例化</div>
<div class="flow-arrow"><i class="fas fa-arrow-right"></i></div>
<div class="box">执行</div>
</div>
<p>
在WebAssembly 3.0中,这些基本架构得到了扩展和优化,特别是在多线程和SIMD支持方面。新的线程模型允许多个Wasm实例共享内存,而SIMD指令集则扩展了Wasm的计算能力,使其能够更高效地处理数据并行任务。
</p>
<div class="comparison">
<div class="comparison-column">
<div class="comparison-title">WebAssembly 2.0</div>
<div class="comparison-item">单线程执行模型</div>
<div class="comparison-item">有限的SIMD支持</div>
<div class="comparison-item">基本的内存管理</div>
<div class="comparison-item">与JavaScript交互需要胶水代码</div>
</div>
<div class="comparison-column">
<div class="comparison-title">WebAssembly 3.0</div>
<div class="comparison-item"><span class="highlight">完整的多线程支持</span></div>
<div class="comparison-item"><span class="highlight">全面的SIMD指令集</span></div>
<div class="comparison-item"><span class="highlight">优化的内存管理</span></div>
<div class="comparison-item">更直接的JavaScript集成</div>
</div>
</div>
</div>
<div class="section">
<h2 class="section-title">
<i class="fas fa-lightbulb"></i>
设计思想
</h2>
<p>
WebAssembly 3.0的设计思想延续了WebAssembly的核心原则,同时针对现代计算需求进行了扩展:
</p>
<ul class="feature-list">
<li><span class="highlight">高性能与接近原生速度</span>:通过多线程和SIMD支持,WebAssembly 3.0进一步缩小了与原生代码的性能差距,特别是在计算密集型任务上。</li>
<li><span class="highlight">安全与沙箱</span>:尽管增加了多线程和共享内存功能,WebAssembly 3.0仍然保持了严格的安全模型,确保代码在受控环境中运行,无法直接访问系统资源。</li>
<li><span class="highlight">开放与可移植</span>:WebAssembly 3.0继续坚持开放标准,确保跨平台兼容性,一次编译,到处运行。</li>
<li><span class="highlight">渐进式增强</span>:WebAssembly 3.0设计为Web平台的补充而非替代,与JavaScript协同工作,开发者可以根据需要选择使用Wasm或JS。</li>
<li><span class="highlight">开发者友好</span>:通过改进工具链和API,WebAssembly 3.0降低了开发门槛,使更多开发者能够利用其强大功能。</li>
</ul>
<div class="note">
<div class="note-title">
<i class="fas fa-question-circle"></i>
JavaScript的时代要结束了吗?
</div>
<p>尽管WebAssembly 3.0带来了强大的性能提升,但它并不是要取代JavaScript。相反,WebAssembly和JavaScript是互补的技术。JavaScript仍然适合大多数Web开发任务,而WebAssembly则专注于处理计算密集型任务。在未来,我们可能会看到更多混合使用JavaScript和WebAssembly的应用,根据任务需求选择最合适的技术。</p>
</div>
</div>
<div class="section">
<h2 class="section-title">
<i class="fas fa-code"></i>
实际应用场景
</h2>
<p>
WebAssembly 3.0的新特性为多种应用场景带来了显著性能提升:
</p>
<div class="application-grid">
<div class="application-card">
<i class="fas fa-gamepad"></i>
<h4>3D游戏与图形渲染</h4>
</div>
<div class="application-card">
<i class="fas fa-music"></i>
<h4>音视频处理</h4>
</div>
<div class="application-card">
<i class="fas fa-flask"></i>
<h4>科学计算</h4>
</div>
<div class="application-card">
<i class="fas fa-image"></i>
<h4>图像编辑</h4>
</div>
</div>
<p>
在这些场景中,WebAssembly 3.0的多线程和SIMD特性可以显著提升性能,而优化的内存管理则减少了资源消耗,使Web应用能够处理更复杂的任务。
</p>
<div class="code-block">
<div class="code-language">C++ (使用WebAssembly 3.0进行图像处理)</div>
<pre><span class="keyword">#include</span> <span class="string"><vector></span>
<span class="keyword">#include</span> <span class="string"><algorithm></span>
<span class="keyword">#include</span> <span class="string"><emscripten/emscripten.h></span>
<span class="keyword">#include</span> <span class="string"><emscripten/val.h></span>
<span class="keyword">using namespace</span> emscripten;
<span class="comment">// 使用SIMD指令加速图像模糊处理</span>
<span class="keyword">extern "C"</span> {
EMSCRIPTEN_KEEPALIVE
<span class="keyword">void</span> <span class="function">blur_image</span>(uint8_t* data, <span class="keyword">int</span> width, <span class="keyword">int</span> height, <span class="keyword">int</span> radius) {
std::vector<uint8_t> temp(width * height * <span class="number">4</span>);
<span class="comment">// 水平模糊</span>
<span class="keyword">for</span> (<span class="keyword">int</span> y = <span class="number">0</span>; y < height; y++) {
<span class="keyword">for</span> (<span class="keyword">int</span> x = <span class="number">0</span>; x < width; x++) {
<span class="keyword">int</span> r = <span class="number">0</span>, g = <span class="number">0</span>, b = <span class="number">0</span>, a = <span class="number">0</span>;
<span class="keyword">int</span> count = <span class="number">0</span>;
<span class="keyword">for</span> (<span class="keyword">int</span> dx = -radius; dx <= radius; dx++) {
<span class="keyword">int</span> nx = x + dx;
<span class="keyword">if</span> (nx >= <span class="number">0</span> && nx < width) {
<span class="keyword">int</span> idx = (y * width + nx) * <span class="number">4</span>;
r += data[idx];
g += data[idx + <span class="number">1</span>];
b += data[idx + <span class="number">2</span>];
a += data[idx + <span class="number">3</span>];
count++;
}
}
<span class="keyword">int</span> idx = (y * width + x) * <span class="number">4</span>;
temp[idx] = r / count;
temp[idx + <span class="number">1</span>] = g / count;
temp[idx + <span class="number">2</span>] = b / count;
temp[idx + <span class="number">3</span>] = a / count;
}
}
<span class="comment">// 垂直模糊(可以使用多线程加速)</span>
<span class="comment">// ... 实现省略</span>
<span class="comment">// 将结果复制回原数组</span>
std::<span class="function">copy</span>(temp.<span class="function">begin</span>(), temp.<span class="function">end</span>(), data);
}
}</pre>
</div>
</div>
</div>
</div>
</body>
</html>
登录后可参与表态
讨论回复
1 条回复
✨步子哥 (steper)
#1
09-19 23:05
登录后可参与表态