何时使用size_t vs uint32_t?我在项目中看到一个方法,它接收一个名为length(类型为uint32_t)的参数来表示要处理的字节数据的长度,该方法用于计算接收到的字节数据的CRC.该参数的类型后来被重构为size_t.在这种情况下使用size_t是否具有技术优势?
例如
- (uint16_t)calculateCRC16FromBytes:(unsigned char *)bytes length:(uint32_t)length;
- (uint16_t)calculateCRC16FromBytes:(unsigned char *)bytes length:(size_t)length;
Run Code Online (Sandbox Code Playgroud) 所以我使用size_t而不是int在任何索引for循环中来防止负指数.但倒数时,这会导致溢出:
for (size_t i = 10; i >= 0; --i) {
// Do something, f.ex. array[i] = i
}
Run Code Online (Sandbox Code Playgroud)
什么是防止这种情况的好方法?
int而代替?我很感激任何反馈!
我通过创建 10 个桶成功编写了基数排序的 C++ 代码。对于这 10 个桶,我是这样创建的:
struct node{
struct node* next;
long value;
};
struct node*bucket[10];
for (int i=0; i<10; ++i) {
bucket[i] = (struct node *) malloc (1000000*sizeof(struct node));
}
Run Code Online (Sandbox Code Playgroud)
做得很完美。
但现在我需要将存储桶的数量增加到 100000。我尝试修改这些存储桶的大小,如下所示:
struct node*bucket[100000];
for (int i=0; i<100000; ++i) {
bucket[i] = (struct node *) malloc (1000000*sizeof(struct node));
}
Run Code Online (Sandbox Code Playgroud)
但这次我想我什至无法创建这些桶。我正在使用 Visual Studio 进行编码,这是用 C++ 编写的。编译器给了我这些警告:
:警告 C4305:“参数”:从“__int64”截断为“size_t”
:警告 C4309:“参数”:常量值截断
我上网查了一下,有人说这个数字太大了。这是我第一次处理链表中这么大的数字。我需要修改任何内容才能使此代码再次工作吗?
谢谢。任何想法和帮助我将不胜感激!
void sizeof_test2();
void sizeof_test2()
{
int array[5];
size_t arr_size = sizeof(array);
printf( "sizeof:\n"
"array = %d\n"
"arr_size = %d\n", sizeof(array), sizeof(arr_size));
}
Run Code Online (Sandbox Code Playgroud)
GCC编译器输出:
sizeof_test2.c: In function `sizeof_test2':
sizeof_test2.c:6: error: `size_t' undeclared (first use in this function)
sizeof_test2.c:6: error: (Each undeclared identifier is<br>
reported only once sizeof_test2.c:6: error: for each function it<br>
appears in.) sizeof_test2.c:6: error: parse error before "arr_size"<br>
sizeof_test2.c:10: error: `arr_size' undeclared (first use in this<br>
function) make[2]: [build/Debug/Cygwin-Windows/sizeof_test2.o]<br>
Error 1 make[1]: [.build-conf] Error 2<br>
Run Code Online (Sandbox Code Playgroud)
不知道为什么我收到这个错误,通过显示size_t类型的正确方法是printf什么?
以下代码按预期工作,即它反向打印字符串
std::string s("abcd");
for (int i=s.length()-1; i>=0; --i) {
std::cout << s[i];
}
Run Code Online (Sandbox Code Playgroud)
但是,以下代码进入无限循环打印垃圾字符,最后崩溃 -
std::string s("abcd");
for (std::size_t i=s.length()-1; i>=0; --i) {
std::cout << s[i];
}
Run Code Online (Sandbox Code Playgroud)
为什么使用崩溃的程序size_t类型i?
我在Windows上使用MinGW附带的g ++
C:/MinGW/bin/g++ --version
g++ (GCC) 6.1.0
Run Code Online (Sandbox Code Playgroud) 我正在学习C++.我的类的一个数据成员应该是类型的size_t.现在size_t不是内置的基本类型,而是一个定义的类型(作为一个通常至少与int一样大的无符号值),它在C++周围被大量使用.
许多C++库,例如iostream或string将自动添加size_t到您当前的范围.
但是,我的课程不需要包含任何花哨的库.由于我希望尽可能保持精简,我只想包含负责创建的文件size_t.
这是哪个图书馆?
这个看似微不足道的小问题,我最近突然想到,但在谷歌上搜索了很多之后,我什至无法找到关于这个主题的意见。仅提及循环和对象大小。
我知道人们喜欢例子,所以这里是首先引起问题的人:
uint64_t deltaSwap( const uint64_t b, const size_t delta, uint64_t mask )
{
return b ^ mask ^ ( mask &= b ^ b >> delta ) << delta;
}
Run Code Online (Sandbox Code Playgroud)
一段时间以来,我一直在尝试对此进行优化,我很清楚这不是编写正确代码的方法,尽管到目前为止它给了我最好的结果,至少在 GCC 中,然后我想到了。如果你真的想学究,不应该是 delta 类型size_t吗?
我从来没有真正理解什么时候使用size_t,所以我从来没有真正理解过,但是如果我知道,这不是正确的用法吗?
更新:这是它的作用的简短解释,虽然不是它是如何做到的,因为我不确定如何解释它:
这是一个标准的 delta 交换,这不是一个新的理想,并且代码运行良好,这与代码无关(但既然你问了),我真正做的就是试验它,以实现最好的性能,以及你在这里看到的版本,是我迄今为止最好的结果。
代码的目的是交换两位或更多位,如果您希望交换第一位和最后一位,则可以这样做:
deltaSwap(b, 63, 0x0000000000000001);
Run Code Online (Sandbox Code Playgroud)
或者如果您希望颠倒位的顺序:
deltaSwap(b, 32, 0x00000000ffffffff);
deltaSwap(b, 16, 0x0000ffff0000ffff);
deltaSwap(b, 8, 0x00ff00ff00ff00ff);
deltaSwap(b, 4, 0x0f0f0f0f0f0f0f0f);
deltaSwap(b, 2, 0x3333333333333333);
deltaSwap(b, 1, 0x5555555555555555);
Run Code Online (Sandbox Code Playgroud)
尽管对于这个特定的任务,deltaswap 可能不是最好的方法。
更新2:只是为了完成,这是我能想到的最正确的在线程序(已经得到了我的答案),并且编译器显然对其进行了完美的优化。
uint64_t deltaSwap( const uint64_t b, const uint_fast8_t delta, const …Run Code Online (Sandbox Code Playgroud) 所有这些都源于我在尝试以下行时编写了一条编译器警告消息(C4267):
const unsigned int nSize = m_vecSomeVec.size();
Run Code Online (Sandbox Code Playgroud)
size()返回size_t虽然typedef为unsigned int,但实际上并不是unsigned int.我认为这与64位可移植性问题有关,但有人可以为我解释一下吗?(我不只是想禁用64位警告.)
假设我必须接受一个大小作为处理数组的接口的参数.对于前者
void doSomethingRelatedToArrays(const size_t length)
Run Code Online (Sandbox Code Playgroud)
在这里,我使用size_t时考虑到以下因素:
但是,我不应该在我的接口中使用无符号类型,因为客户端可以传入负数,这是隐式转换为无符号数,我没有办法在我的方法中验证它.请参阅斯科特·迈尔的文章就这个问题在这里.
所以,我应该将有符号整数类型传递给API.但是如何在系统中获得最大的有符号整数类型?是否有任何类似于size_t的typedef被签名?或者我应该只使用size_t?