我总是被教导使用适当的数据类型,具体取决于类/方法/函数/成员/变量/有什么你的具体需求。那就是说,它甚至更重要了吗?
假设,如果我的某个类的数据成员永远不会是负数且永远不会超过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;
};
答案 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
- 用于文档目的。即使编译器没有对我进行检查,我通常也会发现当我使用度数时我应该使用弧度。