我是否需要在索引数组时始终使用size_t,即使数组的大小不足以超过int的大小?这不是我应该何时使用size_t的问题。我只想知道,例如,一个程序是否有2GB的可用内存(所有这些字段都可以用int32索引)但是这个内存是(虚拟内存)分配给计算机的14GB-16GB的“字段”内存。如果我使用int32而不是size_t(或unsignedlongint)案例?也许问题更多是关于虚拟内存而不是指针。 最佳答案 size_t是一个无符号整数,能够容纳您可以分配的最大对象的大小。它对于索引很有用,因为这意味着它可以索引到您可以分配的最大数
我是否需要在索引数组时始终使用size_t,即使数组的大小不足以超过int的大小?这不是我应该何时使用size_t的问题。我只想知道,例如,一个程序是否有2GB的可用内存(所有这些字段都可以用int32索引)但是这个内存是(虚拟内存)分配给计算机的14GB-16GB的“字段”内存。如果我使用int32而不是size_t(或unsignedlongint)案例?也许问题更多是关于虚拟内存而不是指针。 最佳答案 size_t是一个无符号整数,能够容纳您可以分配的最大对象的大小。它对于索引很有用,因为这意味着它可以索引到您可以分配的最大数
我需要使用一个字符串作为ID来获取一些对象。在运行时实现这一点,并且运行良好。但这使得静态类型检查变得不可能,原因很明显。我在Google上搜索了在编译时计算字符串哈希和的算法:C++compile-timestringhashingwithBoost.MPL.这似乎是我的问题的完美解决方案,除了算法所需的sring应该由4个字符或逐个字符分成几部分,原因很明显。也就是说,我必须这样写,而不是通常的当前ID记录:hash_cstring>::value这绝对不能用。问题是,如何正确地将"object.method"等字符串传递给这个算法?谢谢大家。 最佳答案
我需要使用一个字符串作为ID来获取一些对象。在运行时实现这一点,并且运行良好。但这使得静态类型检查变得不可能,原因很明显。我在Google上搜索了在编译时计算字符串哈希和的算法:C++compile-timestringhashingwithBoost.MPL.这似乎是我的问题的完美解决方案,除了算法所需的sring应该由4个字符或逐个字符分成几部分,原因很明显。也就是说,我必须这样写,而不是通常的当前ID记录:hash_cstring>::value这绝对不能用。问题是,如何正确地将"object.method"等字符串传递给这个算法?谢谢大家。 最佳答案
出于效率原因,我总是避免编写这样的循环:for(std::size_ti=0;i其中vec是一个STL容器。相反,我要么做conststd::size_tvec_size=vec.size();for(std::size_ti=0;i或使用容器迭代器。但第一个解决方案真的有多糟糕?我记得在Meyers中读到它将是二次的而不是线性的,因为vector不知道它的大小并且必须反复计数。但是现代编译器不会检测到这一点并对其进行优化吗? 最佳答案 vector::size()是恒定时间的,通常实现为经过优化的简单内联函数。不要费心手动优化它。
出于效率原因,我总是避免编写这样的循环:for(std::size_ti=0;i其中vec是一个STL容器。相反,我要么做conststd::size_tvec_size=vec.size();for(std::size_ti=0;i或使用容器迭代器。但第一个解决方案真的有多糟糕?我记得在Meyers中读到它将是二次的而不是线性的,因为vector不知道它的大小并且必须反复计数。但是现代编译器不会检测到这一点并对其进行优化吗? 最佳答案 vector::size()是恒定时间的,通常实现为经过优化的简单内联函数。不要费心手动优化它。
我很想知道这些类(class)在内存中的具体安排方式,尤其是。具有继承和虚函数。我知道这不是由c++语言标准定义的。但是,是否有任何简单的方法可以通过编写一些测试代码来找出您的特定编译器将如何实现这些?编辑:-使用下面的一些答案:-#includeusingnamespacestd;classA{public:inta;virtualvoidfunc(){}};classB:publicA{public:intb;virtualvoidfunc(){}};classC{public:intc;virtualvoidfunc(){}};classD:publicA,publicC{pub
我很想知道这些类(class)在内存中的具体安排方式,尤其是。具有继承和虚函数。我知道这不是由c++语言标准定义的。但是,是否有任何简单的方法可以通过编写一些测试代码来找出您的特定编译器将如何实现这些?编辑:-使用下面的一些答案:-#includeusingnamespacestd;classA{public:inta;virtualvoidfunc(){}};classB:publicA{public:intb;virtualvoidfunc(){}};classC{public:intc;virtualvoidfunc(){}};classD:publicA,publicC{pub
以下代码在gcc4.8和Clang3.2下编译:intmain(){intsize=10;intarr[size];}C++标准的8.3.4/1规定数组的大小必须是一个整数常量表达式,而size似乎不是。这是两个编译器中的错误,还是我遗漏了什么?最新的VC++CTP拒绝带有这个有趣消息的代码:errorC2466:cannotallocateanarrayofconstantsize0有趣的部分是它似乎认为size为零。但至少它拒绝了代码。gcc和Clang不应该做同样的事情吗? 最佳答案 这是variablelengtharray
以下代码在gcc4.8和Clang3.2下编译:intmain(){intsize=10;intarr[size];}C++标准的8.3.4/1规定数组的大小必须是一个整数常量表达式,而size似乎不是。这是两个编译器中的错误,还是我遗漏了什么?最新的VC++CTP拒绝带有这个有趣消息的代码:errorC2466:cannotallocateanarrayofconstantsize0有趣的部分是它似乎认为size为零。但至少它拒绝了代码。gcc和Clang不应该做同样的事情吗? 最佳答案 这是variablelengtharray