当前位置: 首页 > 知识库问答 >
问题:

首字母缩略词SSO在STD::String上下文中的含义

孙自怡
2023-03-14

显然不是“单点登录”。也许是“共享字符串优化”?

共有1个答案

施华奥
2023-03-14

对自动变量的操作(“从堆栈中”,即不调用malloc/new)就创建的变量)通常比涉及自由存储的操作(“堆”,即使用new)创建的变量快得多。但是,自动数组的大小在编译时是固定的,而自由存储区中的数组的大小则不是。此外,堆栈的大小是有限的(通常是几个MiB),而空闲存储仅受系统内存的限制。

SSO是短/小字符串优化std::string通常将字符串存储为指向空闲存储区(“堆”)的指针,这提供了类似于调用new char[size]的性能特征。这可以防止非常大的字符串的堆栈溢出,但速度可能会慢一些,尤其是在复制操作时。作为一种优化,std::string的许多实现都会创建一个小型自动数组,类似于char[20]。如果您有一个20个字符或更小的字符串(给定这个示例,实际大小不同),它直接将其存储在该数组中。这完全避免了调用new的需要,从而加快了速度。

编辑:

  • 大小
  • 容量
  • 数据的位置

大小可以存储为std::string::size_type或结尾指针。唯一的区别是在用户调用size时需要减去两个指针,还是在用户调用end时需要向指针添加size_type。容量也可以以任何一种方式存储。

首先,考虑基于我上面概述的简单实现:

class string {
public:
    // all 83 member functions
private:
    std::unique_ptr<char[]> m_data;
    size_type m_size;
    size_type m_capacity;
    std::array<char, 16> m_sso;
};
class string {
public:
    // all 83 member functions
private:
    size_type m_size;
    union {
        class {
            // This is probably better designed as an array-like class
            std::unique_ptr<char[]> m_data;
            size_type m_capacity;
        } m_large;
        std::array<char, sizeof(m_large)> m_small;
    };
};
 类似资料:
  • 我正在阅读关于持久性的Redis文档-https://redis.io/topics/persistence-我想知道首字母缩略词AOF和RDB代表什么。谢谢!:)

  • 我正在学习MIPS procesor体系结构。 根据本教程,它指出:没有互锁管道级的微处理器http://en.wikipedia.org/wiki/MIPS_architecture 流水线的一个主要障碍是,某些指令(如除法)需要更长的时间才能完成,因此CPU必须等待下一条指令进入流水线 该问题的一个解决方案是使用一系列联锁装置,允许各阶段指示它们正忙,从而暂停上游的其他阶段<轩尼诗的团队将这些

  • 问题 你想把字符串中每个单词的首字母转换为大写形式。 解决方案 使用“拆分-映射-拼接”模式:先把字符串拆分成单词,然后通过映射来大写单词第一个字母小写其他字母,最后再将转换后的单词拼接成字符串。 ("foo bar baz".split(' ').map (word) -> word[0].toUpperCase() + word[1..-1].toLowerCase()).join ' ' #

  • 我需要一个正则表达式来捕获一个字符串的单词部分,这是骆驼大小写,可能有一个首字母缩略词在其中。换句话说,我想将一个骆驼大小写字符串拆分为它的单词和缩略词。

  • 问题内容: 这个问题看起来很古怪,或者只是愚蠢,但是当您使用缩略词时,您对骆驼肠衣的做法是什么?您是否坚持要求所有内容,甚至首字母缩略词都必须使用驼峰式大写,还是对首字母缩略词进行例外处理?解释也很好。我不确定这种做法如何影响IDE功能(自动完成功能)或行业标准是什么。 问题答案: 对于C#,请查看Microsoft的准则: 一定要大写两个字符的首字母缩写词,但驼峰式标识符的第一个单词除外。 名为

  • 本文向大家介绍怎么让英文单词的首字母大写?相关面试题,主要包含被问及怎么让英文单词的首字母大写?时的应答技巧和注意事项,需要的朋友参考一下