草庐IT

c++ - 使用现代编译器的 C++ 中的 "memset"功能状态

上下文:不久前,我偶然发现了Alexandrescu在2001年发表的这篇DDJ文章:http://www.ddj.com/cpp/184403799这是关于将缓冲区初始化为某个值的各种方法的比较。就像“memset”对单字节值所做的一样。他比较了各种实现(memcpy、显式“for”循环、duff的设备),并没有真正找到跨所有数据集大小和所有编译器的最佳候选者。引用:Thereisaverydeep,andsad,realizationunderlyingallthis.Wearein2001,theyearoftheSpatialOdyssey.(...)Juststepoutof

c++ - 什么特征/概念可以保证 memsetting 一个对象是明确定义的?

假设我定义了一个zero_initialize()函数:templateTzero_initialize(){Tresult;std::memset(&result,0,sizeof(result));returnresult;}//usage:autodata=zero_initialize();为某些类型调用zero_initialize()会导致未定义的行为1,2。我目前正在强制执行T来验证std::is_pod.随着该特性在C++20中被弃用以及概念的出现,我很好奇zero_initialize()应该如何发展。什么(最小)特征/概念可以保证memsetting对象的定义明确?

c++ - 什么特征/概念可以保证 memsetting 一个对象是明确定义的?

假设我定义了一个zero_initialize()函数:templateTzero_initialize(){Tresult;std::memset(&result,0,sizeof(result));returnresult;}//usage:autodata=zero_initialize();为某些类型调用zero_initialize()会导致未定义的行为1,2。我目前正在强制执行T来验证std::is_pod.随着该特性在C++20中被弃用以及概念的出现,我很好奇zero_initialize()应该如何发展。什么(最小)特征/概念可以保证memsetting对象的定义明确?

c++ - 为什么将此 POD 结构用作基类会很危险?

我和一位同事进行了这次谈话,结果很有趣。假设我们有以下POD类structA{voidclear(){memset(this,0,sizeof(A));}intage;chartype;};clear旨在清除所有成员,设置为0(按字节)。如果我们使用A作为基类会出现什么问题?这里有一个微妙的错误来源。 最佳答案 编译器可能会在A中添加填充字节。因此sizeof(A)会超出chartype(直到填充结束)。但是,在继承的情况下,编译器可能不会添加填充字节。所以对memset的调用会覆盖部分子类。

c++ - 为什么将此 POD 结构用作基类会很危险?

我和一位同事进行了这次谈话,结果很有趣。假设我们有以下POD类structA{voidclear(){memset(this,0,sizeof(A));}intage;chartype;};clear旨在清除所有成员,设置为0(按字节)。如果我们使用A作为基类会出现什么问题?这里有一个微妙的错误来源。 最佳答案 编译器可能会在A中添加填充字节。因此sizeof(A)会超出chartype(直到填充结束)。但是,在继承的情况下,编译器可能不会添加填充字节。所以对memset的调用会覆盖部分子类。

c++ - 为什么发布版本 memset 比 visual studio 2012 中的调试版本慢?

为什么在visualstudio2012中发布版本的memset比调试版本慢?在visualsutido2010中,也是这个结果。我的电脑:英特尔酷睿i7-37703.40GHz8G内存操作系统:Windows7SP164位这是我的测试代码:#includeintmain(){constintSize=1000*1024*1024;char*Data=(char*)malloc(Size);#ifdef_DEBUGprintf_s("debug\n");#elseprintf_s("release\n");#endifboost::progress_timertimer;memset(

c++ - 为什么 memset() 放在循环体内时不能正常工作?

昨天我用C++编写了一小段代码,其中包含一个循环和一个数组。在程序中,每次循环重新开始时我都需要重置数组。但是,如果我使用memset(sum,sizeof(sum),0);那么数组就不会被重置为全0。对于这个程序我使用了:for(i=0;i相反。但是,我认为循环不像函数那样清晰,它需要一个额外的变量,更不用说这比memset()函数的魔法还要酷上百万倍。各位大神能给个启发吗? 最佳答案 您实际上是将sum的大小写入前0个字节。您应该改为执行memset(sum,0,sizeof(sum))。(换句话说,参数是目标、数据和长度,您提

c++ - CUDA,使用 memset(或 fill 或 ...)将 float 数组设置为 max val possible

编辑:感谢之前的回答。但实际上我想在CUDA中进行,显然CUDA没有Fill函数。我必须为每个线程填充一次矩阵,所以我想确保我使用的是最快的方法。这是我最好的选择吗?我想将float矩阵设置为可能的最大值(在float中)。做这项工作的正确方法是什么?float*matrix=newfloat[N*N];for(inti=0;i提前致谢。 最佳答案 CUDA中最简单的方法是使用thrust::fill.Thrust包含在CUDA4.0及更高版本中,或者您可以installit如果您使用的是CUDA3.2。#include#inclu

c++ - C++中正确使用memset和memcpy初始化字符数组

我想用字符指针中的数据初始化一个字符数组。我为此编写了以下代码:(请原谅我对结构所做的一切......实际上这段代码应该适合更大的东西,因此该结构及其使用很奇怪)#include#includestructABC{chara;charb;charc[16];};intmain(intargc,charconst*argv[]){structABC**abc;std::string_r="Ritwik";constchar*r=_r.c_str();if(_r.length()c)){intpadding=sizeof((*abc)->c)-_r.length();std::coutc)

c++ - 在 CUDA 内核中使用 memset

这似乎是一个显而易见的问题,但谷歌没有找到任何有趣的东西。在CUDA内核中使用memset是否合法,例如:__device__voidmyKernel(){intarray[10];memset(array,0,sizeof(array));//...etc...}(我知道intarray[10]={0};可能更好,但这只是一个更复杂的例子。) 最佳答案 是的,如AppendixBoftheprogrammingmanual中所述,memset,以及memcpy,malloc,和free(后两者仅在计算能力上>=2.0设备)在设备代