数据类型范围是否更像是一种节省内存的措施?

时间:2014-05-17 00:47:27

标签: c++ memory types range

我总是被教导使用适当的数据类型,具体取决于类/方法/函数/成员/变量/有什么你的具体需求。那就是说,它甚至更重要了吗?

假设,如果我的某个类的数据成员永远不会是负数且永远不会超过unsigned char的最大值,那么将它存储为unsigned char(1个字节)由于隐式类型提升/降级,内部表示,寄存器大小以及经常引用的“在使用int时CPU更有效”而与int(4字节)甚至不重要了?

示例:

class Foo {
    public:
        Foo() : _status(0) { /* DO NOTHING */ }
        void AddTo(unsigned char value) {
            if(std::numeric_limits<unsigned char>::max() - _stat < value) {
                value = std::numeric_limits<unsigned char>::max() - _status;
            }
            _status += value;
        }

        void Increment() {
            if(_status == std::numeric_limits<unsigned char>::max()) return;
            ++_status;
        }
    private:
        unsigned char _status;
};

5 个答案:

答案 0 :(得分:3)

一般使用“正确大小”类型的主要影响是你和其他人浪费了大量时间。

如果您存储了数值,例如一个非常大的图片,或者如果你绝对需要一个64位的范围,那么肯定,在这种情况下,正确的尺寸是有道理的。

但是使用正确的大小作为一般指导方针不会带来显着的收益和痛苦。

权威论证:创建该语言的Bjarne Stroustrup通常只使用几种类型,例如: int表示整数。

答案 1 :(得分:1)

&#34;过早优化是所有邪恶的根源&#34;唐纳德克努特。

这个数据成员的大小是否会显着影响班级的规模?你在上课吗?序列化表示是否看到任何减少?当你的老板不关心时,你是否更难以解读这个问题呢?

Y2K,IPv4 32位地址,ASCII,是的,未来会回顾你的代码并大笑。记住摩尔定律,写一些有用的东西,并期望某些东西会出错。直到它是你永远不会知道什么。编写可测试的,可维护的和可重构的代码,它可能只能保持足够长的时间以供有人照顾。

答案 2 :(得分:0)

对于针对PC和服务器的大多数用例,您无需担心使用char和使用int来保存数值。只需使用int,或者如果您需要更大范围,请使用long

但是,如果您的目标是platform with 16 bytes of RAM which has less than 1 KB to store your program,则可能需要仔细考虑该循环计数器是否真的需要超过1个字节。

答案 3 :(得分:0)

除非选择其他变量类型的特定原因,否则请坚持使用int。现代编程的很大一部分是管理复杂性,如果它实际上没有任何帮助,就没有理由开始使用各种类型的代码。当然,如果您有5,000个特定类的副本或者在内存占用严重受限的系统上工作,那么它可能很重要。但是在一个多GB的系统上,这通常不会成为一个问题。在这种情况下,它更多的是写一些可理解和可维护的东西。

答案 4 :(得分:0)

你遇到了C风格语言的一个问题。它们剥夺了您可以用其他语言进行范围检查的能力。如果您的值应该在特定范围内,那么说一个类型的能力可以是1比64,这对于错误跟踪是一个很大的帮助。我通过将它转换为pascal或ada在C / C ++代码中发现了很多错误。

我喜欢在你描述的情况下将typedef用于文档目的 -

COLORCOMPONENT DEGREES RADIANS

- 用于文档目的。即使编译器没有对我进行检查,我通常也会发现当我使用度数时我应该使用弧度。