看完后隐藏功能和C++/STL的暗角上comp.lang.c++.moderated,我完全惊讶的是,下面的代码片断编译并在两个Visual Studio 2008和G ++ 4.4的工作.
这是代码:
#include <stdio.h>
int main()
{
int x = 10;
while (x --> 0) // x goes to 0
{
printf("%d ", x);
}
}
Run Code Online (Sandbox Code Playgroud)
我假设这是C,因为它也适用于GCC.标准中定义了哪里,它来自何处?
是否有之间的差异size_t和container::size_type?
我所理解的size_t是更通用的,可以用于任何size_types.
但是container::size_type针对特定种类的容器进行了优化?
我总是使用unsigned int来表示永远不应该是负数的值.但是今天我在代码中发现了这种情况:
void CreateRequestHeader( unsigned bitsAvailable, unsigned mandatoryDataSize,
unsigned optionalDataSize )
{
If ( bitsAvailable – mandatoryDataSize >= optionalDataSize ) {
// Optional data fits, so add it to the header.
}
// BUG! The above includes the optional part even if
// mandatoryDataSize > bitsAvailable.
}
Run Code Online (Sandbox Code Playgroud)
我应该开始使用int而不是unsigned int来表示数字,即使它们不能为负数吗?
在我allocator通过阅读一些文章
(cppreference和我们内存不足)来研究几天之后,
我对如何控制数据结构以某种方式分配内存感到困惑.
我很确定我误解了一些东西,
所以我将把剩下的问题分成很多部分,以便让我的错误更容易被引用.
这是我(错误)理解的: -
假设这B::generateCs()是一个C从列表中生成列表的函数CPrototype.
在B::generateCs()被使用B()的构造函数: -
class C {/*some trivial code*/};
class CPrototype {/*some trivial code*/};
class B {
public:
std::vector<C> generateCs() {
std::vector<CPrototype> prototypes = getPrototypes();
std::vector<C> result; //#X
for(std::size_t n=0; n < prototypes.size(); n++) {
//construct real object (CPrototype->C)
result.push_back( makeItBorn(prototypes[n]) );
}
return result;
}
std::vector<C> bField; //#Y
B() {
this->bField = generateCs(); //#Y …Run Code Online (Sandbox Code Playgroud) 可能重复:
何时使用std :: size_t?
我的代码中有很多常量是无符号数,例如计数器,频率截止,长度等.我开始使用std::size_t所有这些,而不是int或unsigned int.
这是正确的做法吗?我开始它是因为STL容器使用它的大小,它用于字符串位置等.
我很困惑size_t.我知道这是一个未签名的类型..正确吗?我的问题是,何时应该使用它.是否有理由将它与常规数组一起使用?我的意思是必须声明数组大小真的很大,如此巨大,以至于常规的无符号或有符号无法处理它.然后一个size_t人能够处理它吗?有人能举个例子吗?
有这样一种类型std::size_t.它可以用于描述对象的大小,因为它可以保证能够表达任何对象的最大大小(因此在这里写).但是,这是什么意思?我们实际上没有内存中的对象.那么这是否意味着这种类型可以存储一个整数,代表我们理论上可以使用的最大内存量?
如果我尝试写类似的东西
size_t maxSize = std::numeric_limits<std::size_t>::max();
new char[maxSize];
Run Code Online (Sandbox Code Playgroud)
我会得到一个错误,因为数组的总大小限制为0x7fffffff.为什么?而且,如果我传递一个等于的非常量表达式maxSize,std::bad_array_new_length将被抛出.如果我传递的表达式小于maxSize但仍然大于0x7fffffff,std::bad_alloc则会抛出.我想这std::bad_alloc是因为内存不足而引发的,不是因为大小大于0x7fffffff.为什么会这样?我想如果我们分配的内存大小大于0x7fffffff(这是在编译时传递给new []的const的最大值),抛出一个特殊异常是很自然的.为什么std::bad_array_new_length只有在我通过时才被抛出maxSize?这种情况特别吗?
顺便说一下,如果我将maxSize传递给vector的构造函数,如下所示:
vector<char> vec(maxSize);
Run Code Online (Sandbox Code Playgroud)
std::bad_alloc将被抛出,而不是std::bad_array_new_length.这是否意味着vector使用不同的分配器?
我正在尝试自己实现数组.使用unsigned int来存储大小,容量和索引是一种糟糕的方法.所以定义一些这样的别名是个好主意:
typedef std::size_t size_type;
Run Code Online (Sandbox Code Playgroud)
用size_type而不是unsigned int?
我试图在Microsoft Visual Studio中创建一些示例代码
int main()
{
const size_t size = 10;
int arr[size];
for (size_t i = 0; i < size; ++i)
arr[i] = i;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
现在JetBrains ResharperC++发出以下警告 arr[i] = i;
我无法理解这意味着什么以及如何解决此警告.
由于这是我经常使用的方案,我有点担心警告.
任何人都可以建议或指出我正确的方向吗?
编辑:将循环更改为:
for (size_t i = 0; i < size; ++i)
arr[i] = 0;
Run Code Online (Sandbox Code Playgroud)
仍然会发出警告.
我想添加一个函数,它将.size()值作为整数返回,而不是无符号整数.
编辑:由于评论,我解释更详细:
我有代码:
int something = 3;
if(arr.size() > something)
Run Code Online (Sandbox Code Playgroud)
这将产生编译器警告,我不喜欢添加(int)到我拥有它的每个地方.所以,我认为使用sizei()函数会很好的解决方案:
int something = 3;
if(arr.sizei() > something)
Run Code Online (Sandbox Code Playgroud)
哪个不会产生警告.
所以,我不想创建一个单独的函数,而是std :: vector本身的一个函数.
编辑:似乎这样做的唯一方法是创建另一个函数,例如:
template <typename T>
inline int sizei(const T &arr){
return (int)arr.size();
}
Run Code Online (Sandbox Code Playgroud)
从积极的方面来看:这似乎根本不会增加我的可执行文件大小.
c++ ×9
c++11 ×2
allocation ×1
arrays ×1
c ×1
coding-style ×1
memory ×1
operators ×1
performance ×1
size-t ×1
size-type ×1
std ×1
types ×1
variables ×1