草庐IT

warn_memset_zero_len

全部标签

c++ - 与 memset 不同,placement new 能否存活优化?

所以我真的很想知道它能否在GCC和clang采用的激进优化策略中幸存下来。考虑以下示例:void*clean(void*pointer,std::size_tsize)noexcept{returnnew(pointer)char[size]{};}voiddoStuff(){//...clean(pointer,size);//...}我可以信任它清理敏感数据的任务吗? 最佳答案 我不认为优化可以在这里对你耍任何花招。在这种情况下,标准要求值初始化:new(pointer)char[size]{},因此在此调用后pointer指向

c++ - 与 memset 不同,placement new 能否存活优化?

所以我真的很想知道它能否在GCC和clang采用的激进优化策略中幸存下来。考虑以下示例:void*clean(void*pointer,std::size_tsize)noexcept{returnnew(pointer)char[size]{};}voiddoStuff(){//...clean(pointer,size);//...}我可以信任它清理敏感数据的任务吗? 最佳答案 我不认为优化可以在这里对你耍任何花招。在这种情况下,标准要求值初始化:new(pointer)char[size]{},因此在此调用后pointer指向

c++ - 相对于 memset,我可以从 std::fill_n(ptr, n, 0) 获得什么性能?

对于作为指针的迭代器ptr,std::fill_n(ptr,n,0)应该与memset(ptr,0,n*sizeof(*ptr))(但请参阅@KeithThompson对thisanswer的评论)。对于C++11/C++14/C++17模式下的C++编译器,在哪些条件下可以期望它们编译为相同的代码?并且当/如果它们不编译为相同的代码时,-O0是否存在显着的性能差异?-O3?注意:当然,部分/大部分答案可能是特定于编译器的。我只对一两个特定的编译器感兴趣,但请写下你知道答案的编译器。 最佳答案 答案取决于您对标准库的实现。例如,MS

c++ - 相对于 memset,我可以从 std::fill_n(ptr, n, 0) 获得什么性能?

对于作为指针的迭代器ptr,std::fill_n(ptr,n,0)应该与memset(ptr,0,n*sizeof(*ptr))(但请参阅@KeithThompson对thisanswer的评论)。对于C++11/C++14/C++17模式下的C++编译器,在哪些条件下可以期望它们编译为相同的代码?并且当/如果它们不编译为相同的代码时,-O0是否存在显着的性能差异?-O3?注意:当然,部分/大部分答案可能是特定于编译器的。我只对一两个特定的编译器感兴趣,但请写下你知道答案的编译器。 最佳答案 答案取决于您对标准库的实现。例如,MS

c - 如何将 memset() 内存设置为特定模式而不是单个字节?

我需要将重复模式写入内存(例如0x11223344),以便整个内存看起来像(十六进制):1122334411223344112233441122334411223344112233441122334411223344...我不知道如何用memset()来做,因为它只需要一个字节,而不是4个字节。有什么想法吗? 最佳答案 在OSX上,为此使用memset_pattern4();我希望其他平台也有类似的API。我不知道一个简单的可移植解决方案,除了用循环填充缓冲区(这非常简单)。 关于c-如

c - 如何将 memset() 内存设置为特定模式而不是单个字节?

我需要将重复模式写入内存(例如0x11223344),以便整个内存看起来像(十六进制):1122334411223344112233441122334411223344112233441122334411223344...我不知道如何用memset()来做,因为它只需要一个字节,而不是4个字节。有什么想法吗? 最佳答案 在OSX上,为此使用memset_pattern4();我希望其他平台也有类似的API。我不知道一个简单的可移植解决方案,除了用循环填充缓冲区(这非常简单)。 关于c-如

c - 为什么 memset、memchr 等内存函数在 string.h 中,而在 stdlib.h 中却没有另一个 mem 函数?

我想知道,为什么这样的功能:-memset-memmov-memchr-memcpy存在于string.h头文件中,但不存在于stdlib.h文件中,其中还有其他标准内存函数如动态内存分配:malloc、calloc、realloc、free。也许将它们合并到一个标题中会更好?你怎么看待这件事?我不明白,为什么一组内存函数与其他函数分开并存在于字符串头(string.h)中。 最佳答案 因为实际上string.h被定义为一个标准头文件,它声明了处理字符数组而不仅仅是字符串的函数。memcpy和memset等函数接受的参数被视为指向字

c - 为什么 memset、memchr 等内存函数在 string.h 中,而在 stdlib.h 中却没有另一个 mem 函数?

我想知道,为什么这样的功能:-memset-memmov-memchr-memcpy存在于string.h头文件中,但不存在于stdlib.h文件中,其中还有其他标准内存函数如动态内存分配:malloc、calloc、realloc、free。也许将它们合并到一个标题中会更好?你怎么看待这件事?我不明白,为什么一组内存函数与其他函数分开并存在于字符串头(string.h)中。 最佳答案 因为实际上string.h被定义为一个标准头文件,它声明了处理字符数组而不仅仅是字符串的函数。memcpy和memset等函数接受的参数被视为指向字

一篇搞定MySQL索引长度(key_len)计算规则

MySQL索引长度(key_len)计算 计算规则索引字段:没有设置NOTNULL,则需要加1个字节。定长字段:tinyint占1个字节、int占4个字节、bitint占8个字节、date占3个字节、datetime占5 个字节、char(n)占n个字节。变长字段:varchar(n)占n个字符+2个字节。注意(字符和字节在不同编码之间的转换) 不同的字符集,一个字符占用的字节数不同latin1编码:每个字符占用一个字节。gbk编码:每个字符占用两个字节。utf8编码:每个字符占用三个字节。utf8mb4编码:每个字符占用四个字节。案例分析(一)、编码为utf8创建测试表CREATETABLE

c++ - 如何使用 memset 将 volatile 数组设置为零?

volatileuint8_treset_mask[768]={0}现在我在内部操作之一期间将此数组元素的值设置为1。在另一个函数调用中,我需要将此数组的所有元素设置为0。一种方法是使用for循环,但我相信分配数组所有元素的更好方法是使用memsetmemset(reset_mask,0,sizeof(reset_mask));但我收到此错误:-“从类型'volatileuint8_t*{akavolatileunsignedchar*}'类型转换为类型'void*'抛弃限定符”如果我们不能在这里使用memset,有没有更好的方法一次性设置这个volatile数组的所有元素?