使用具有不同整数类型的 std::vector 是否始终安全<size_t>?
Is it always safe to use std::vector<size_t> with different integer types?
试图接收一个我认为完全错误的解决方案的向量,我认为当std::vector<size_t>
的元素首先分配给一个小值,然后对于一个大问题,可能会出现错误或数据丢失,因为已经设置了整个向量的类型,并且安排了内存中的某些空间。
但是,以下代码有效:
#include<vector>
#include<iostream>
#include<typeinfo>
int main(){
std::vector<size_t> vec;
// Fixing size and adding small number which
// I suppose would set type as a small one,
// i.e. int
vec.resize(2);
int i = 0;
std::fill(vec.begin(),vec.end(),i);
// add a big number that should not fit smaller type
unsigned long long bignum = 18446744073709551614;
vec.push_back(bignum);
std::cout<<vec[0]<<" "<<vec[1]<<" "<<vec[2]<<std::endl;
std::cout<<typeid(vec[0]).name()<<std::endl
<<typeid(vec[1]).name()<<std::endl<<typeid(vec[2]).name()<<std::endl;
// cell 0 was already initialized with int, trying to make oveflow
vec[0] = 18446744073709551613;
std::cout<<vec[0]<<" "<<vec[1]<<" "<<vec[2]<<std::endl;
std::cout<<typeid(vec[0]).name()<<std::endl
<<typeid(vec[1]).name()<<std::endl<<typeid(vec[2]).name()<<std::endl;
return 1;
}
但是,输出不包含类型名称,也许是因为我的编译器:
$ ./a.out
0 0 18446744073709551614
m
m
m
18446744073709551613 0 18446744073709551614
m
m
m
那么,当我不知道使用的整数类型时,我可以使用vector::<size_t>
自由操作(发送到功能等)安全吗?
vector<size_t>
是指向量,其条目都是 size_t
。如果您尝试存储不是size_t
的值,则将其隐式转换为size_t
。如果原始值是[0
,SIZE_MAX
]范围之外的整数。
您的问题表明您想象向量正在存储各种不同类型的对象,但这并没有发生。
注意:size_t
通常表示最大的可分配单元的大小。也许最好使用更多反映您正在存储的值的源的类型,例如uint64_t
。
在@stargateur的答案中,最好的便携式下注是intmax_t
和uintmax_t
。它们可以保证是平台上可用的最大整数类型。
可能还可能有编译器特定的扩展名,例如__int128_t
。此答案提供了有关海湾合作委员会中128位内置的一些信息。请注意,std::intmax_t
将为64位。
不,这不是安全的。
这只是工作,因为您放了int >= 0
。size_t
是unsigned
,因此,如果您尝试放置负值,则会有negative_value % 2**n
,其中n是用于表示无符号类型的位数。
您向量的元素是size_t
。使用i
填充它时,您要求编译器将int
施放到size_t
中。这不是"安全"。
vec[0] = 18446744073709551613;
在这里这是安全的,因为VEC [0]是size_t
。
注意size_t
旨在处理...大小。因此,无法固定可以处理size_t
的最大值。如果您想要库存整数。使用<cstdint>
。
- 从不同线程使用int64的不同字节安全吗
- 将数组作为参数传递给函数安全吗?作为第三方职能部门,可以探索他们想要的之外的其他元素
- 虚拟决赛作为安全
- 获取日期异步信号安全吗?如果在信号处理程序中使用,它会导致死锁吗
- 请解释这句话(cout<<1+int((a<b)^((b-a)&1) )<<endl
- 呼叫运营商<<临时
- 如何将元素添加到数组的线程安全函数?
- C++中的线程安全删除
- 通过网络、跨平台传递std::变体是否安全
- 如何防止clang格式在流运算符调用之间添加换行符<<
- 在std::thread中,joinable()然后join()线程安全吗
- <<操作员在下面的行中工作
- 使用std::istream::peek()总是安全的吗
- 从值小于256的uint16到uint8的Endian安全转换
- 在c++队列中使用pop和visit实现线程安全
- 在类型和包装器之间reinterpret_cast是否安全<Type>?
- 以线程安全的方式调用"QQuickPaintedItem::updateImage(const QImage&image)"(no QThread)
- 全局变量 多读取器 一个写入器多线程安全?
- 安全到标准:移动会员?
- AcquireCredentialsHandleA() 返回 PFX 文件的0x8009030e(安全包中没有可用的凭据