C++20 小语法
这个提案允许在static_assert和if constexpr中从整形转换为布尔类型。
以下表格就可以表示所有内容。
对于严格的C++ 编译器来说,以前在这种情境下int无法向下转换为bool,需要手动强制转换,
C++23 这一情况得到了改善。
对于严格的C++编译器来说,以前在这种情境下int
无法向下转换为bool
,需要手动强制转换,C++23这一情况得到了改善。
目前在GCC 9和Clang 13以上版本支持该特性。
11 forward_like(P2445)
这个在Deducing this
那节已经使用过了,是同一个作者。
使用情境让我们回顾一下这个例子:
auto callback = [m = get_message(), &scheduler](this auto&& self) -> bool {return scheduler.submit(std::forward_like<decltype(self)>(m));
};callback(); // retry(callback)
std::move(callback)(); // try-or-fail(rvalue)
std::forward_like
加入到了<utility>
中,就是根据模板参数的值类别来转发参数。
如果closure type为左值,那么m
将转发为左值;如果为右值,将转发为右值。
听说Clang 16和MSVC v19.34支持该特性,但都尚未发布。
12 #elifdef and #elifndef(P2334)
这两个预处理指令来自WG14(C的工作组),加入到了C23。C++为了兼容C,也将它们加入到了C++23。
也是一个完善工作。
#ifdef
和#ifndef
分别是#if defined()
和#if !defined()
的简写,而#elif defined()
和#elif !defined()
却并没有与之对应的简写指令。因此,C23使用#elifdef
和#elifndef
来补充这一遗漏。
总之,是两个非常简单的小特性。目前已在GCC 12和Clang 13得到支持。
13 #warning(P2437)
#warning
是主流编译器都会支持的一个特性,最终倒逼C23和C++23也加入了进来。
这个小特性可以用来产生警告信息,与#error
不同,它并不会停止翻译。
用法很简单:
#ifndef FOO
#warning "FOO defined, performance might be limited"
#endif
目前MSVC不支持该特性,其他主流编译器都支持。
14 constexpr std::unique_ptr(P2273R3)
std::unique_ptr
也支持编译期计算了,一个小例子:
constexpr auto fun() {auto p = std::make_unique<int>(4);return *p;
}int main() {constexpr auto i = fun();static_assert(4 == i);
}
目前GCC 12和MSVC v19.33支持该特性。
15 Improving string and string_view(P1679R3, P2166R1, P1989R2, P1072R10, P2251R1)
string
和string_view
也获得了一些增强,这里简单地说下。
P1679为二者增加了一个contain()
函数,小例子:
std::string str("dummy text");
if (str.contains("dummy")) {// do something
}
目前GCC 11,Clang 12,MSVC v19.30支持该特性。
P2166使得它们从nullptr
构建不再产生UB,而是直接编译失败。
std::string s { nullptr }; // error!
std::string_view sv { nullptr }; // error!
目前GCC 12,Clang 13,MSVC v19.30支持该特性。
P1989是针对std::string_view
的,一个小例子搞定:
int main() {std::vector v { 'a', 'b', 'c' };// Beforestd::string_view sv(v.begin(), v.end());// Afterstd::string_view sv23 { v };
}
以前无法直接从Ranges构建std::string_view
,而现在支持这种方式。
该特性在GCC 11,Clang 14,MSVC v19.30已经支持。
P1072为string
新增了一个成员函数:
template< class Operation >
constexpr void resize_and_overwrite( size_type count, Operation op );
可以通过提案中的一个示例来理解:
int main() {std::string s { "Food: " };s.resize_and_overwrite(10, [](char* buf, int n) {return std::find(buf, buf + n, ':') - buf;});std::cout << std::quoted(s) << '\n'; // "Food"
}
主要是两个操作:改变大小和覆盖内容。第1
个参数是新的大小,第2
个参数是一个op
,用于设置新的内容。
然后的逻辑是:
- 如果
maxsize <= s.size()
,删除最后的size()-maxsize
个元素; - 如果
maxsize > s.size()
,追加maxsize-size()
个默认元素; - 调用
erase(begin() + op(data(), maxsize), end())
。
这里再给出一个例子,可以使用上面的逻辑来走一遍,以更清晰地理解该函数。
constexpr std::string_view fruits[] {"apple", "banana", "coconut", "date", "elderberry"};
std::string s1 { "Food: " };s1.resize_and_overwrite(16, [sz = s1.size()](char* buf, std::size_t buf_size) {const auto to_copy = std::min(buf_size - sz, fruits[1].size()); // 6std::memcpy(buf + sz, fruits[1].data(), to_copy); // append "banana" to s1.return sz + to_copy; // 6 + 6
});std::cout << s1; // Food: banana
注意一下,maxsize
是最大的可能大小,而op
返回才是实际大小,因此逻辑的最后才有一个erase()
操作,用于删除多余的大小。
这个特性在GCC 12,Clang 14,MSVC v19.31已经实现。
接着来看P2251,它更新了std::span
和std::string_view
的约束,从C++23开始,它们必须满足TriviallyCopyable
Concept。
主流编译器都支持该特性。
最后来看P0448,其引入了一个新的头文件<spanstream>
。
大家都知道,stringstream
现在被广泛使用,可以将数据存储到string
或vector
当中,但这些容器当数据增长时会发生「挪窝」的行为,若是不想产生这个开销呢?
<spanstream>
提供了一种选择,你可以指定固定大小的buffer
,它不会重新分配内存,但要小心数据超出buffer
大小,此时内存的所有权在程序员这边。
一个小例子:
#define ASSERT_EQUAL(a, b) assert(a == b)
#define ASSERT(a) assert(a)int main() {char input[] = "10 20 30";std::ispanstream is{ std::span<char>{input} };int i;is >> i;ASSERT_EQUAL(10,i);is >> i;ASSERT_EQUAL(20,i);is >> i;ASSERT_EQUAL(30,i);is >> i;ASSERT(!is);
}
目前GCC 12和MSVC v19.31已支持该特性。
16 static operator()(P1169R4)
因为函数对象,Lambdas使用得越来越多,经常作为标准库的定制点使用。这种函数对象只有一个operator ()
,如果允许声明为static
,则可以提高性能。
至于原理,大家可以回顾一下Deducing this那节的Pass this by value提高性能的原理。明白静态函数和非静态函数在重载决议中的区别,大概就能明白这点。
顺便一提,由于mutidimensional operator[]
如今已经可以达到和operator()
一样的效果,它也可以作为一种新的函数语法,你完全可以这样调用foo[]
,只是不太直观。因此,P2589也提议了static operator[]。
17 std::unreachable(P0627R6)
当我们知道某个位置是不可能执行到,而编译器不知道时,使用std::unreachalbe
可以告诉编译器,从而避免没必要的运行期检查。
一个简单的例子:
void foo(int a) {switch (a) {case 1:// do somethingbreak;case 2:// do somethingbreak;default:std::unreachable();}
}bool is_valid(int a) {return a == 1 || a == 2;
}int main() {int a = 0;while (!is_valid(a))std::cin >> a;foo(a);
}
该特性位于<utility>
,在GCC 12,Clang 15和MSVC v19.32已经支持。
18 std::to_underlying(P1682R3)
同样位于<utility>
,用于枚举到其潜在的类型,相当于以下代码的语法糖:
static_cast<std::underlying_type_t<Enum>>(e);
一个简单的例子就能看懂:
void print_day(int a) {fmt::print("{}\n", a);
}enum class Day : std::uint8_t {Monday = 1,Tuesday,Wednesday,Thursday,Friday,Saturday,Sunday
};int main() {// Beforeprint_day(static_cast<std::underlying_type_t<Day>>(Day::Monday));// C++23print_day(std::to_underlying(Day::Friday));
}
的确很简单吧!
该特性目前在GCC 11,Clang 13,MSVC v19.30已经实现。
19 std::byteswap(P1272R4)
位于<bit>
,顾名思义,是关于位操作的。
同样,一个例子看懂:
template <std::integral T>
void print_hex(T v)
{for (std::size_t i = 0; i < sizeof(T); ++i, v >>= 8){fmt::print("{:02X} ", static_cast<unsigned>(T(0xFF) & v));} std::cout << '\n';}int main()
{unsigned char a = 0xBA;print_hex(a); // BAprint_hex(std::byteswap(a)); // BAunsigned short b = 0xBAAD;print_hex(b); // AD BAprint_hex(std::byteswap(b)); // BA ADint c = 0xBAADF00D;print_hex(c); // 0D F0 AD BAprint_hex(std::byteswap(c)); // BA AD F0 0Dlong long d = 0xBAADF00DBAADC0FE;print_hex(d); // FE C0 AD BA 0D F0 AD BAprint_hex(std::byteswap(d)); // BA AD F0 0D BA AD C0 FE
}
可以看到,其作用是逆转整型的字节序。当需要在两个不同的系统传输数据,它们使用不同的字节序时(大端小端),这个工具就会很有用。
该特性目前在GCC 12,Clang 14和MSVC v19.31已经支持。
20 std::stacktrace(P0881R7, P2301R1)
位于<stacktrace>
,可以让我们捕获调用栈的信息,从而知道哪个函数调用了当前函数,哪个调用引发了异常,以更好地定位错误。
一个小例子:
void foo() {auto trace = std::stacktrace::current();std::cout << std::to_string(trace) << '\n';
}int main() {foo();
}
输出如下。
0# foo() at /app/example.cpp:5
1# at /app/example.cpp:10
2# at :0
3# at :0
4#
注意,目前GCC 12.1和MSVC v19.34支持该特性,GCC 编译时要加上-lstdc++_libbacktrace
参数。
std::stacktrace
是std::basic_stacktrace
使用默认分配器时的别名,定义为:
using stacktrace = std::basic_stacktrace<std::allocator<std::stacktrace_entry>>;
而P2301,则是为其添加了PMR版本的别名,定义为:
namespace pmr {
using stacktrace =std::basic_stacktrace<std::pmr::polymorphic_allocator<std::stacktrace_entry>>;
}
于是使用起来就会方便一些。
// Before
char buffer[1024];std::pmr::monotonic_buffer_resource pool{std::data(buffer), std::size(buffer)};std::basic_stacktrace<std::pmr::polymorphic_allocator<std::stacktrace_entry>>trace{&pool};// After
char buffer[1024];std::pmr::monotonic_buffer_resource pool{std::data(buffer), std::size(buffer)};std::pmr::stacktrace trace{&pool};
这个特性到时再单独写篇文章,在此不细论。
21 Attributes(P1774R8, P2173R1, P2156R1)
Attributes在C++23也有一些改变。
首先,P1774新增了一个Attribute [[assume]]
,其实在很多编译器早已存在相应的特性,例如__assume()
(MSVC, ICC),__builtin_assume()
(Clang)。GCC没有相关特性,所以它也是最早实现标准[[assume]]
的,目前就GCC 13支持该特性(等四月发布,该版本对Rangs的支持也很完善)。
现在可以通过宏来玩:
#if defined(__clang__)#define ASSUME(expr) __builtin_assume(expr)
#elif defined(__GNUC__) && !defined(__ICC)#define ASSUME(expr) if (expr) {} else { __builtin_unreachable(); }
#elif defined(_MSC_VER) || defined(__ICC)#define ASSUME(expr) __assume(expr)
#endif
论文当中的一个例子:
void limiter(float* data, size_t size) {ASSUME(size > 0);ASSUME(size % 32 == 0);for (size_t i = 0; i < size; ++i) {ASSUME(std::isfinite(data[i]));data[i] = std::clamp(data[i], -1.0f, 1.0f);}
}
第一个是假设size
永不为0
,总是正数;第二个告诉编译器size
总是32
的倍数;第三个表明数据不是NaN
或无限小数。
这些假设不会被评估,也不会被检查,编译器假设其为真,依此优化代码。若是假设为假,可能会产生UB。
使用该特性与否编译产生的指令数对比结果如下图。
其次,P2173使得可以在Lambda表达式上使用Attributes,一个例子:
// Any attribute so specified does not appertain to the function
// call operator or operator template itself, but its type.
auto lam = [][[nodiscard]] ->int { return 42; };int main()
{lam();
}// Output:
// <source>: In function 'int main()':
// <source>:12:8: warning: ignoring return value of '<lambda()>', declared with attribute 'nodiscard' [-Wunused-result]
// 12 | lam();
// | ~~~^~
// <source>:8:12: note: declared here
// 8 | auto lam = [][[nodiscard]] ->int { return 42; };
// | ^
注意,Attributes属于closure type,而不属于operator ()
。
因此,有些Attributes不能使用,比如[[noreturn]]
,它表明函数的控制流不会返回到调用方,而对于Lambda函数是会返回的。
除此之外,此处我还展示了C++的另一个Lambda特性。
在C++23之前,最简单的Lambda表达式为[](){}
,而到了C++23,则是[]{}
,可以省略无参时的括号,这得感谢P1102。
早在GCC 9就支持Attributes Lambda,Clang 13如今也支持。
最后来看P2156,它移除了重复Attributes的限制。
简单来说,两种重复Attributes的语法评判不一致。例子:
// Not allow
[[nodiscard, nodiscard]] auto foo() {return 42;
}// Allowed
[[nodiscard]][[nodiscard]] auto foo() {return 42;
}
为了保证一致性,去除此限制,使得标准更简单。
什么时候会出现重复Attributes,看论文怎么说:
During this discussion, it was brought up that the duplication across attribute-specifiers are to support cases where macros are used to conditionally add attributes to an attribute-specifier-seq, however it is rare for macros to be used to generate attributes within the same attribute-list. Thus, removing the limitation for that reason is unnecessary.
在基于宏生成的时候可能会出现重复Attributes,因此允许第二种方式;宏生成很少使用第一种形式,因此标准限制了这种情况。但这却并没有让标准变得更简单。因此,最终移除了该限制。
目前使用GCC 11,Clang 13以上两种形式的结果将保持一致。
22 Lambdas(P1102R2, P2036R3, P2173R1)
Lambdas表达式在C++23也再次迎来了一些新特性。
像是支持Attributes,可以省略()
,这在Attributes这一节已经介绍过,不再赘述。
另一个新特性是P2036提的,接下来主要说说这个。
这个特性改变了trailing return types的Name Lookup规则,为什么?让我们来看一个例子。
double j = 42.0;
// ...
auto counter = [j = 0]() mutable -> decltype(j) {return j++;
};
counter
最终的类型是什么?是int
吗?还是double
?其实是double
。
无论捕获列表当中存在什么值,trailing return type的Name Lookup都不会查找到它。
这意味着单独这样写将会编译出错:
auto counter = [j=0]() mutable -> decltype(j) {return j++;
};// Output:
// <source>:6:44: error: use of undeclared identifier 'j'
// auto counter = [j=0]() mutable -> decltype(j) {
// ^
因为对于trailing return type来说,根本就看不见捕获列表中的j
。
以下例子能够更清晰地展示这个错误:
template <typename T> int bar(int&, T&&); // #1
template <typename T> void bar(int const&, T&&); // #2int i;
auto f = [=](auto&& x) -> decltype(bar(i, x)) {return bar(i, x);
}f(42); // error
在C++23,trailing return types的Name Lookup规则变为:在外部查找之前,先查找捕获列表,从而解决这个问题。
目前没有任何编译器支持该特性。
23 Literal suffixes for (signed) size_t(P0330R8)
这个特性为std::size_t
增加了后缀uz
,为signed std::size_t
加了后缀z
。
有什么用呢?看个例子:
#include <vector>int main() {std::vector<int> v{0, 1, 2, 3};for (auto i = 0u, s = v.size(); i < s; ++i) {/* use both i and v[i] */}
}
这代码在32 bit平台编译能够通过,而放到64 bit平台编译,则会出现错误:
<source>(5): error C3538: in a declarator-list 'auto' must always deduce to the same type
<source>(5): note: could be 'unsigned int'
<source>(5): note: or 'unsigned __int64'
在32 bit平台上,i
被推导为unsigned int
,v.size()
返回的类型为size_t
。而size_t
在32 bit上为unsigned int
,而在64 bit上为unsigned long long
。(in MSVC)
因此,同样的代码,从32 bit切换到64 bit时就会出现错误。
而通过新增的后缀,则可以保证这个代码在任何平台上都能有相同的结果。
#include <vector>int main() {std::vector<int> v{0, 1, 2, 3};for (auto i = 0uz, s = v.size(); i < s; ++i) {/* use both i and v[i] */}
}
如此一来就解决了这个问题。
目前GCC 11和Clang 13支持该特性。
文章拷贝自:
https://zhuanlan.zhihu.com/p/600302082
相关文章:
C++20 小语法
这个提案允许在static_assert和if constexpr中从整形转换为布尔类型。 以下表格就可以表示所有内容。 对于严格的C 编译器来说,以前在这种情境下int无法向下转换为bool,需要手动强制转换, C23 这一情况得到了改善。 对于严格的C编译器来说&a…...
LM393比较器的比较翻转电压不对
问个问题,用的LM393比较器,3.3V供电,比较器输出上拉到3.3V, V给的基准2.8V,V-电压从1V升到2.3V,比较器就输出0V了,按理论超过2.8V才翻转到0V的 根据问题描述和电路分析,比较器LM393…...
解决 shadui组件库Popover 点击后会消失
react用了shadui组件库 <Popover><PopoverTrigger><div className"text-operation-item" onClick{props.callback}><img src{props.imgSrc} width{20} height{20} /></div></PopoverTrigger><PopoverContent className"…...
国联股份卫多多与北京慧闻科技(集团)签署战略合作协议
4月27日,北京慧闻科技(集团)有限公司(以下简称“慧闻科技”)销售总监王兴卓一行到访国联股份卫多多,同卫多多/纸多多副总裁、产发部总经理段任飞,卫多多机器人产业链总经理桂林展开深入交流&…...
从数据到决策:如何使用Python进行自动驾驶数据分析
从数据到决策:如何使用Python进行自动驾驶数据分析 大家好,我是Echo_Wish,今天来和大家聊一聊在自动驾驶领域中,如何通过Python进行数据分析。随着自动驾驶技术的不断发展,数据分析在这一领域的作用越来越重要。从传感器数据的处理到模型的训练和优化,Python在自动驾驶数…...
IIS服务器提示ERR_HTTP2 PROTOCOL ERROR解决方案
今天我的淘宝店来了一个客户,说小程序苹果访问没问题,安卓系统访问出现ERR HTTP2 PROTOCAL ERROR的错误见下图 方法供大家闭坑步骤:通过注册表修改(高级) 打开注册表编辑器 (regedit) 导航到: HKEY_LOCAL_MACHINE\SYSTEM\Current…...
Django的异步任务队列管理_Celery
1 基本原理 Celery 是一个异步任务队列,能够将耗时操作(如发邮件、处理图片、网络爬虫等)从 Django 主线程中分离出来,由后台的 worker 处理,避免阻塞请求。Celery 作为独立运行的后台进程(Worker…...
Ubuntu18.04安装IntelliJ IDEA2025步骤
1.下载linux版本的idea 复制下面链接到虚拟机浏览器 下载 IntelliJ IDEA 下载好后,你的文件里会多一个文件,如下图 2.解压并运行Idea 2.1在/usr/local/路径下新建安装目录IDEA: 打开终端输入以下命令: sudo mkdir -p /usr/loc…...
LLM - Large Language Model
回顾2024:与LLM又相伴一年的经历与思考 - 知乎万字长文入门大语言模型(LLM) - 知乎“大模型本质就是两个文件!”特斯拉前AI总监爆火LLM科普,时长1小时,面向普通大众 - 知乎大模型本质及趋势剖析,…...
解决Ubuntu20.04重启出现显卡驱动异常的问题(操作记录)
一、问题情况 电脑异常断电,重启后,显示界面异常,显卡驱动已丢失。 二、操作流程 1、查看安装显卡驱动 ls /usr/src | grep nvidia 记住该驱动,我的是nvidia-550.127.05 2、安装dkms(如果没有) sudo …...
23.开关电源干扰控制的EMC改善措施
开关电源干扰控制的EMC改善措施 1. 开关电源的EMI干扰机理2. 钳位抑制EMI3. 阻容吸收抑制EMI4. 波形整形抑制EMI 1. 开关电源的EMI干扰机理 2. 钳位抑制EMI 只能抑制Ts阶段。 3. 阻容吸收抑制EMI 4. 波形整形抑制EMI...
新能源汽车声纹监测技术的发展趋势是什么?
新能源汽车声纹监测技术有以下发展趋势: 智能化与自动化程度不断提高 故障自动诊断与预警:未来声纹监测系统将能够更加准确地自动识别和分析新能源汽车各部件的声纹特征变化,不仅能检测出故障,还能对故障的发展趋势进行预测&…...
如何获取按关键字搜索京东商品详情(代码示例)
在电商领域,获取京东商品的详细信息对于市场分析、选品上架、库存管理和价格策略制定等方面至关重要。京东作为国内知名的电商平台,提供了丰富的商品资源。通过 Python 爬虫技术,我们可以高效地获取京东商品的详细信息,包括商品名…...
C#中构造器及属性的加载顺序
一.基本原则: 先加载静态构造函数和静态字段,后加载普通构造函数和普通字段;先加载基类再加载子类; 二.具体的加载顺序: 父类静态字段--->父类静态构造函数--->子类静态字段--->子类静态构造函数--->父类实例字段---> 父类实例构造函数--->子类实例字段-…...
vue项目中如何使用markdown编辑器
在开发中,编辑markdown和回显markdown都是常见的需求。在vue(2.x和3.x都可以)中可以使用mavon-editor这个第三方依赖包。示例很简单易懂。 安装 npm install mavon-editor 注册 在main.js中注册这个组件 import Vue from vue import mavonEditor from mavon-editor impor…...
Python爬虫(9)Python数据存储实战:基于pymysql的MySQL数据库操作详解
目录 一、背景与核心价值二、pymysql核心操作详解2.1 环境准备2.2 数据库连接与基础操作2.3 事务处理与错误回滚2.4 高级功能:批量插入与性能优化 三、pymysql进阶技巧3.1 连接池管理(推荐使用DBUtils)3.2 SQL注入防御3.3 与ORM框架对比 四、…...
WPF之Button控件详解
文章目录 1. 引言2. Button控件基础Button类定义 3. Button控件的核心属性3.1 Content属性3.2 IsDefault属性3.3 IsCancel属性3.4 其他常用属性 4. 按钮样式与模板自定义4.1 简单样式设置4.2 使用Style对象4.3 触发器使用4.4 使用ControlTemplate完全自定义4.5 按钮视觉状态 5.…...
如何查看电脑电池使用情况
第一步打开cmd: 在键盘上按下winr 或者在搜索框中输入cmd 点击命令提示符 进入命令框 第二步输入命令: powercfg/batteryreport 出现如下情况 第三部找到对应电池报告进行查看: 在对应路径下找到电池报告 点击battery-report.html 到此…...
软考-软件设计师中级备考 6、数据结构 图
1. 有向图 有向图是由顶点集合 V 和有向边集合 E 组成的图结构。在有向图中,边是有方向的,即从一个顶点指向另一个顶点,通常用有序对 (u, v) 表示,其中 u 是边的起始顶点,v 是边的终止顶点。例如,在一个表…...
Label Studio 软件介绍及安装使用说明
背景说明 在做AI项目建模的时候,往往需要数据标注工作,比较常用的数据标注软件是Labeling或者Labelme,这两个都是离线的单独标注软件,使用起来是比较方便的,也是入门级学者比较适合的软件,然而有时候我们数据标注的数据…...
Azure 数字孪生是什么?
“Azure 数字孪生”是一项平台即服务 (PaaS) 产品/服务,它能够创建基于整个环境的数字模型的孪生图,这些图可能是建筑物、工厂、农场、能源网络、铁路、体育场馆,甚至整个城市。 这些数字模型可用于获取洞察力,以推动产品改进、运…...
界面控件DevExpress WPF v25.1预览 - AI功能增强(语义搜索)
DevExpress WPF拥有120个控件和库,将帮助您交付满足甚至超出企业需求的高性能业务应用程序。通过DevExpress WPF能创建有着强大互动功能的XAML基础应用程序,这些应用程序专注于当代客户的需求和构建未来新一代支持触摸的解决方案。 无论是Office办公软件…...
【神经网络与深度学习】五折交叉验证(5-Fold Cross-Validation)
引言 五折交叉验证(5-Fold Cross-Validation)是一种广泛应用于机器学习模型性能评估的技术,通过多次实验确保模型的评估结果更加稳定、可靠,同时最大限度地利用有限的数据资源。它将数据分成若干子集,交替作为训练集和…...
Linux权限概念讲解
1. 用户类型 1.1 用户分类 在Linux里面用户分为两类,一种是超级用户(root),一种是普通用户。 超级用户只有一个,而普通用户可以有很多个。 如果我们在root用户状态下想要变成普通用户,我们可以使用命令…...
网络安全零基础培训 L1-8 PHP基础语法
文章目录 1 认识PHP1.1 PHP简介1.2 主要的特点1.3 跨平台性1.4 与数据库的良好集成1.5 开源和社区支持1.6 应用场景1.6.1 网站开发1.6.2 内容的管理程序1.6.3 Web应用程序开发1.6.4 为什么学习了解PHP 2 PHP的基础语法2.1 创建第一个PHP程序2.2 如何写注释2.3 PHP的变量2.4 PHP…...
鸿蒙 长列表加载性能优化
长列表加载性能优化 针对长列表加载这一场景,对列表渲染时间、页面滑动帧率、应用内存占用等方面带来优化,提升性能和用户体验的手段有如下 4 种: 懒加载:提供列表数据按需加载能力,解决一次性加载长列表数据耗时长、…...
第十二届蓝桥杯 2021 C/C++组 卡片
目录 题目: 题目描述: 题目链接: 思路: 思路详解: 代码: 代码详解: 题目: 题目描述: 题目链接: 卡片 - 蓝桥云课 思路: 思路详解&#…...
vscode 使用gitcode团队管理项目
1、下载安装vscode https://code.visualstudio.com/Download 2、安装git 3、在vscode中安装GitLens插件 4、打开终端 点击会显示当前更改的项目 5、提交更改的文件,会提示输入用户名、密码,这里的密码即是令牌,令牌在第一次创建的时候显…...
uniapp+vue3+ts 使用canvas实现安卓端、ios端及微信小程序端二维码生成及下载
加粗样式uniapp多端生成带二维码海报并保存至相册的实现 在微信小程序开发中,我们常常会遇到生成带有二维码的海报并保存到手机相册的需求,比如分享活动海报、产品宣传海报等。今天就来和大家分享一下如何通过代码实现这一功能。 准备工作 在开始之前&am…...
vue mixin混入与hook
mixin混入是 选项式 API,在vue3-Composition API <script setup> 中无法直接使用,需通过 setup() 函数转换 vue2、vue3选项式API: // mixins/mixin.js export const mixin {methods: {courseType(courseLevel) {const levelMap {1: 初级,…...
《Masked Autoencoders Are Scalable Vision Learners》---CV版的BERT
目录 一、与之前阅读文章的关系? 二、标题:带掩码的自auto编码器是一个可拓展的视觉学习器 三、摘要 四、核心图 五、结果图 六、不同mask比例对比图 七、“Introduction” (He 等, 2021, p. 1) 引言 八、“Related Work” (He 等, 2021, p. 3)相…...
(云计算HCIP)HCIP全笔记(十三)本篇介绍虚拟化技术,内容包含:虚拟化资源、虚拟化过程、I/O虚拟化、虚拟化架构KVM和Xen介绍、主流虚拟化技术介绍
1. 虚拟化资源 1.1 虚拟化对象 CPU虚拟化: 目标是使虚拟机上的指令能被正常执行,且效率接近物理机 内存虚拟化: 目标是能做好虚拟机内存空间之 间的隔离,使每个虚拟机都认为自己拥有了整个内存地址,且效率页能接近物理…...
C++核心编程:类与对象全面解析
C核心编程:类与对象全面解析 大家好!今天我要和大家深入探讨C面向对象编程中最核心的概念:类与对象。👨💻 这是我们迈向高级C开发的第一步,掌握好这部分内容,对未来学习更高级的设计模式和框…...
Linux基础命令和文件系统结构:从入门到实践
目录 1. 引言 2. Linux文件系统结构概述 2.1 根目录 编辑 2.2 常见目录介绍: 1. /home:用户的家目录 2. /etc:存放配置文件的目录 3. /var:可变数据 4. /bin 和 /sbin:常见命令和系统管理工具 5. /tmp&…...
「Mac畅玩AIGC与多模态05」部署篇03 - 在 Mac 上部署本地向量化模型(Embedding Models)
一、概述 本篇介绍如何在 macOS 环境下,为 Dify 平台部署本地向量化模型(Embedding Models),支持知识库文档向量化、语义检索与智能体上下文增强。向量化模型是实现知识库问答与 RAG(检索增强生成)应用的基础组件。 二、部署流程 1. 环境准备 确认 Docker Desktop 正常…...
Java-Optional类
介绍 Optional是 Java 8 引入的一个类,用于解决空指针异常问题。它本质上是一个容器类,可以包含或不包含一个非空值。 示例 创建Optional对象 Optional.of(T value):创建一个包含非空值的Optional对象。如传入null值,会抛出Nu…...
Android 热点开发调试总结
Android 热点开发调试总结 文章目录 Android 热点开发调试总结一、前言二、热点开发1、开关和默认配置wifi和热点配置信息保存的位置: 2、主要流程3、相关日志4、相关广播5、demo示例 三、其他1、Android 热点开发调试小结2、其他热点相关知识小结(1&…...
【“星瑞” O6 评测】 — llm CPU部署对比高通骁龙CPU
前言 随着大模型应用场景的不断拓展,arm cpu 凭借其独特优势在大模型推理领域的重要性日益凸显。它在性能、功耗、架构适配等多方面发挥关键作用,推动大模型在不同场景落地 1. CPU对比 星睿 O6 CPU 采用 Armv9 架构,集成了 Armv9 CPU 核心…...
快乐数(双指针解法)
题目链接202. 快乐数 - 力扣(LeetCode) 题目拆解 1 取一个正整数每一位的平方和为,如果为1那么直接可以判定为快乐数,如果不为1,就重复这个过程,直到出现1 2 实际上,这道题只有两种情况…...
【Vue3-Bug】中路由加载页面直接显示空白
Vue3中路由加载页面直接显示空白 没有子路由 路由定义不能重复,请自己查看数据在main.js(或者)mina.ts入口文件中,需要将router的注入到vue中的执行放在,vue挂在元素之前 // 顺序不能变 app.use(router) app.mount(#app)在App.vue中 // 在…...
线性代数——行列式⭐
目录 一、行列式的定义⭐ 1-1、三阶行列式练习 1-2、下面介绍下三角行列式、上三角行列式、对角行列式 编辑 二、行列式的性质 2-1、性质1,2,3,4,5,6 编辑 2-2、性质7 2- 3、拉普拉斯定理、克莱姆法则 三…...
flume----初步安装与配置
目录标题 **flume的简单介绍**⭐flume的**核心组件**⭐**核心特点** **安装部署**1)**解压安装包**2)**修改名字** **(配置文件时,更方便)****3)⭐⭐配置文件**4)**兼容Hadoop**5)**…...
vscode源代码管理Tab-文件右侧标志(M、A 等)的含义
Git 常用标志(M、A 等)的含义 在 VSCode 的源代码管理(Source Control)标签页中,文件右侧显示的 Monaco 装饰徽章(Badge)(如 M、A 等),本质上是对 Git 文件状态标志 的可视化呈现。…...
【力扣刷题实战】丢失的数字
大家好,我是小卡皮巴拉 文章目录 目录 力扣题目:丢失的数字 题目描述 解题思路 问题理解 算法选择 具体思路 解题要点 完整代码(C) 兄弟们共勉 !!! 每篇前言 博客主页:小…...
具身智能机器人的应用场景及最新进展
具身智能机器人正通过“感知-学习-决策-行动”的闭环能力,重塑全球各行业的生产与服务模式。以下是其在当今世界的典型应用场景及最新进展: 一、工业制造:柔性生产与智能运维 高精度装配与检测 特斯拉Optimus通过双目视觉与惯性测量单元&…...
网络安全怎么入门?快速了解
网络安全是一个快速发展的领域,入门需要系统化的学习和实践。以下是适合零基础或转行者的分阶段学习路径,涵盖必备知识、学习资源、实战方法和职业方向: 一、基础阶段(1-3个月) 1. 掌握核心基础知识 计算机网络&#…...
STM32N6570-DK ISP调试
STM32N6570-DK之ISP调试应用 准备工作-下载安装软件包:一、使用STM32CubeProgrammer给板子烧入STM32N6_ISP_IQTune_App_revC01-v1.1.0-trusted.bin。二、打开STM32 ISP IQTune.exe ,出现可连接端口:三、根据教程进行相应调试:准备工作-下载安装软件包: https://www.st.co…...
Nacos源码—1.Nacos服务注册发现分析一
大纲 1.客户端如何发起服务注册 发送服务心跳 2.服务端如何处理客户端的服务注册请求 3.注册服务—如何实现高并发支撑上百万服务注册 4.内存注册表—如何处理注册表的高并发读写冲突 1.客户端如何发起服务注册 发送服务心跳 (1)Nacos客户端项目启动时为什么会自动注册服…...
NHANES指标推荐:CTI
文章题目:Association between the C-reactive protein-triglyceride-glucose index and endometriosis: a cross-sectional study using data from the national health and nutrition examination survey, 1996-2006 DOI:10.1186/s12905-024-03541-x 中…...
开源模型应用落地-全能音频新纪元-Kimi-Audio-7B-Instruct-重塑多模态交互边界
一、前言 在AI技术持续突破的2025年,音频交互正从单一任务处理迈向全场景融合的新阶段。4月27日,月之暗面(Moonshot AI)开源的Kimi-Audio-7B-Instruct,以“全能音频通才”之姿,为这一进程树立了里程碑式标杆。这款基于70亿参数架构的模型,首次在单一框架内整合语…...