专栏首页C++核心准则原文翻译C++核心准则C.180:使用联合体节约内存

C++核心准则C.180:使用联合体节约内存

C.180: Use unions to save memory

C.180:使用联合体节约内存

Reason(原因)

A union allows a single piece of memory to be used for different types of objects at different times. Consequently, it can be used to save memory when we have several objects that are never used at the same time.

联合体使用同一块内存管理在存在于不同时刻的不同类型的对象。也就是说,当不同的对象永远不会同时使用的时候,使用联合体可以节约内存。

Example(示例)

union Value {
    int x;
    double d;
};

Value v = { 123 };  // now v holds an int
cout << v.x << '\n';    // write 123
v.d = 987.654;  // now v holds a double
cout << v.d << '\n';    // write 987.654

But heed the warning: Avoid "naked" unions。

但是要留意这条准则:C.181:避免原始的联合体。

Example(示例)

// Short-string optimization

constexpr size_t buffer_size = 16; // Slightly larger than the size of a pointer

class Immutable_string {
public:
    Immutable_string(const char* str) :
        size(strlen(str))
    {
        if (size < buffer_size)
            strcpy_s(string_buffer, buffer_size, str);
        else {
            string_ptr = new char[size + 1];
            strcpy_s(string_ptr, size + 1, str);
        }
    }

    ~Immutable_string()
    {
        if (size >= buffer_size)
            delete string_ptr;
    }

    const char* get_str() const
    {
        return (size < buffer_size) ? string_buffer : string_ptr;
    }

private:
    // If the string is short enough, we store the string itself
    // instead of a pointer to the string.
    union {
        char* string_ptr;
        char string_buffer[buffer_size];
    };

    const size_t size;
};
Enforcement(实施建议)

???

原文链接:

https://github.com/isocpp/CppCoreGuidelines/blob/master/CppCoreGuidelines.md#c180-use-unions-to-save-memory


觉得本文有帮助?请分享给更多人。

关注【面向对象思考】轻松学习每一天!

面向对象开发,面向对象思考!

本文分享自微信公众号 - 面向对象思考(OOThinkingDalian),作者:面向对象思考

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2020-03-07

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • C++核心准则ES.20: 保证所有对象被初始化

    Avoid used-before-set errors and their associated undefined behavior. Avoid prob...

    面向对象思考
  • C++核心准则T.44:使用函数模板推断类模板参数类型(如果可能)

    Writing the template argument types explicitly can be tedious and unnecessarily ...

    面向对象思考
  • C++核心准则ES.78:不要依靠switch语句的隐式下沉处理

    Always end a non-empty case with a break. Accidentally leaving out a break is a ...

    面向对象思考
  • SceneKit - 将屏幕坐标转换至游戏场景oc+swift版

    酷走天涯
  • Md5加密秘钥加密哈希加密

    加密通用类: public class EncryptClass { /// <summary> /// 返回M...

    用户1055830
  • jsp 实栗 jsp + jdbc 登录

    一个表单页,输入用户登录和密码,然后信息提交到jsp页面进行验证,如果可以服务器跳转到登录成功页,失败,跳转到错误页

    mySoul
  • 详解个性化推荐五大最常用算法

    允中 若朴 编译自 Stats&Bots 量子位 出品 | 公众号 QbitAI ? 推荐系统,是当今互联网背后的无名英雄。 我们在某宝首页看见的商品,某条上读...

    量子位
  • Spring原理:10个Spring&SpringBoot高阶用法,你是否清楚?

    通过ApplicationContextAware实现,在bean实例化后,经过Aware扫描时,发现实现了ApplicationContextAware接口,...

    lyb-geek
  • CSS3背景

    小胖
  • Lucene.net(4.8.0) 学习问题记录五: JIEba分词和Lucene的结合,以及对分词器的思考

    前言:目前自己在做使用Lucene.net和PanGu分词实现全文检索的工作,不过自己是把别人做好的项目进行迁移。因为项目整体要迁移到ASP.NET Core ...

    ShenduCC

扫码关注云+社区

领取腾讯云代金券