什么时候使用size_t?

参考:

https://www.cnblogs.com/litifeng/p/7464307.html

http://www.it1352.com/454944.html

关于size_t

问题1:为啥不用int而是size_t这么古怪的类型,搞出好多类型不匹配的警告?

答:一个共识是:int类型一般小于等于数据线的宽度,而size_t类型一般为大于等于地址线宽度。而地址线宽度常常是大于数据线宽度的。

在数据只有8位的年代,地址率先进入10位,12位,在数据16位的年代,地址也已经进入了20位,24位。目前的int普遍是32位,而地址线宽度在主流平台中都是64位。

size_t为什么存在?因为无论int还是unsigned都很可能小于地址线宽度需要的大小,所以必须有个size_t。

问题2:为什么size_t后面要什么有个_t?

答:_t的意思就是type。关于为什么要加_t。一个类型后面加了_t说明了这是一个POSIX或GNU保留类型,防止命名空间污染(namespace pollution)。

不然标准库里新加了什么类型说不定就和用户已经定义的类型重名了。所以POSIX规定自己扩展的类型都加_t,这样只要用户定义类型的时候不加_t就不会冲突。

为什么要使用size_t?

需要在循环条件中与size_t 本身进行比较。

size_t 是任何 sizeof 表达式的类型,并且保证能够表达任何对象的最大大小包括任何数组。通过扩展它也保证足够大的任何数组索引,因此它是一个自然类型的循环通过数组的索引。

如果你只是向上计数到一个数字,那么可能更自然的是使用保存该数字的变量类型或 int 或 unsigned int (如果足够大),因为这些应该是机器的自然大小。

例子

class Solution {
public:
    int removeDuplicates(vector<int>& nums) {
        int num=0;
        if(nums.size() == 1){
            return 1;
        }
        for(size_t i=0;i<nums.size();++i){
            int a;
            a = nums[nums.size()-1];
            nums.pop_back();
            if(a != nums[0]){
                nums.insert(nums.begin(),a);
                num++;
            }
            else{
                if(i == 0){
                    num = 1;
                }
                nums.insert(nums.begin()+i,a);
            }
        }
        return num;
    }
};

 

  • 7
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
这段代码是一个命名空间 `DIS` 下的函数 `w2c`,其功能是将宽字符字符串转换为窄字符字符串。下面是函数的具体实现: 1. 首先,判断输入的宽字符指针 `_Src` 是否为空,如果为空,则返回一个空的字符串 `""`。 2. 如果 `_Src` 不为空,则根据 `_Src` 的长度计算需要分配的目标字符数组 `dst` 的大小。这里通过 `wcslen(_Src)` 函数获取 `_Src` 的长度,乘以 `sizeof(wchar_t)` 得到字节数,并加上 1,用于存储字符串结束符。 3. 根据计算得到的目标字符数组大小,使用 `new` 运算符在堆上分配内存,创建一个 `char` 类型的数组 `dst`。 4. 调用 `_create_locale` 函数创建一个 `_locale_t` 类型的变量 `locale`,该变量用于设置字符转换所使用的地域设置。这里使用了 ".936" 地域设置,表示中国简体中文。 5. 调用 `_wcstombs_s_l` 函数进行宽字符转换为窄字符。该函数接受以下参数: - `&convertedChars`:指向一个 `size_t` 类型的变量的指针,用于接收转换后的字符数。 - `dst`:目标字符数组,用于存储转换后的窄字符。 - `dstSizeInBytes`:目标字符数组的大小,以字节为单位。 - `_Src`:要转换的宽字符字符串。 - `_TRUNCATE`:表示如果转换后的字符数超过了 `dstSizeInBytes`,则截断多余的字符。 - `locale`:表示字符转换所使用的地域设置。 6. 调用 `_free_locale` 函数释放之前创建的地域设置。 7. 将转换后的窄字符数组 `dst` 转换为 `std::string` 类型,并将其赋值给变量 `reVal`。 8. 释放之前在堆上分配的目标字符数组 `dst`。 9. 返回转换后的字符串 `reVal`。 需要注意的是,该代码使用了 C++ 的动态内存分配和释放,需要确保在适当的时候释放分配的内存,以避免内存泄漏。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值