memset比for循环更有效.所以,如果我有
char x[500];
memset(x,0,sizeof(x));
Run Code Online (Sandbox Code Playgroud)
要么
char x[500];
for(int i = 0 ; i < 500 ; i ++) x[i] = 0;
Run Code Online (Sandbox Code Playgroud)
哪一个更有效率,为什么?是否在硬件中有任何特殊指令来进行块级初始化.
我参与了其中一个挑战,你试图生成尽可能小的二进制文件,所以我在没有 C或C++运行时库(RTL)的情况下构建我的程序.我没有链接到DLL版本或静态版本.我甚#include至没有头文件.我有这个工作正常.
有些RTL函数memset()可能很有用,所以我尝试添加自己的实现.它在Debug构建中工作正常(即使对于编译器生成隐式调用的那些地方memset()).但是在Release版本中,我得到一个错误,说我无法定义内部函数.您可以看到,在发布版本中,内部函数已启用,并且memset()是内在函数.
我希望memset()在我的发布版本中使用内在函数,因为它可能内联,比我的实现更小,更快.但我似乎是一个陷阱22.如果我没有定义memset(),链接器会抱怨它是未定义的.如果我确定它,编译器会抱怨我无法定义内部函数.
有没有人知道定义,声明,#pragma编译器和链接器标志的正确组合,以获得内部函数而不会拉入RTL开销?
Visual Studio 2008,x86,Windows XP +.
为了使问题更具体:
extern "C" void * __cdecl memset(void *, int, size_t);
#ifdef IMPLEMENT_MEMSET
void * __cdecl memset(void *pTarget, int value, size_t cbTarget) {
char *p = reinterpret_cast<char *>(pTarget);
while (cbTarget > 0) {
*p++ = static_cast<char>(value);
--cbTarget;
}
return pTarget;
}
#endif
struct MyStruct {
int foo[10];
int bar;
};
int main() …Run Code Online (Sandbox Code Playgroud) 假设我有一些遗留代码,除非发现错误,否则无法更改,并且它包含以下代码:
bool data[32];
memset(data, 0, sizeof(data));
Run Code Online (Sandbox Code Playgroud)
这是bool将数组中的所有false值设置为值的安全方法吗?
更一般地,是安全的memset一bool对0,以使其价值false?
是否保证可以在所有编译器上运行?或者我是否要求修复?
char str[] = "beautiful earth";
memset(str, '*', 6);
printf("%s", str);
Output:
******ful earth
Run Code Online (Sandbox Code Playgroud)
1)像上面使用memset一样,我们可以只将几个整数数组索引值初始化为1,如下所示?
int arr[15];
memset(arr, 1, 6);
Run Code Online (Sandbox Code Playgroud) 我来自Python,最近学习C ++。我正在学习一个名为C / C ++的函数,memset并从https://www.geeksforgeeks.org/memset-in-cpp/网站中遵循在线示例,在该示例中我遇到了一些编译错误:
/**
* @author : Bhishan Poudel
* @file : a02_memset_geeks.cpp
* @created : Wednesday Jun 05, 2019 11:07:03 EDT
*
* Ref:
*/
#include <iostream>
#include <vector>
#include <cstring>
using namespace std;
int main(int argc, char *argv[]){
char str[] = "geeksforgeeks";
//memset(str, "t", sizeof(str));
memset(str, 't', sizeof(str));
cout << str << endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
使用单引号't'时出错
这将打印多余的字符。
tttttttttttttt!R@`
Run Code Online (Sandbox Code Playgroud)
在双引号中使用“ t”时出错
tttttttttttttt!R@`
Run Code Online (Sandbox Code Playgroud)
如何在C ++中使用memset?
进一步的研究此处
提供了具有缺点的优秀教程memset:https : //web.archive.org/web/20170702122030/https …
在 C 中,
{0}通用零初始值设定项与 C++ 的通用零初始值设定项等效{}(后者在 C 中无效)。每当您想要一个完整但概念上不透明或实现定义类型的零初始化对象时,就有必要使用它。C 标准库中的经典示例是mbstate_t:Run Code Online (Sandbox Code Playgroud)mbstate_t state = { 0 }; /* correctly zero-initialized */与常见但不可移植的相比:
Run Code Online (Sandbox Code Playgroud)mbstate_t state; memset(&state, 0, sizeof state);
让我感到奇怪的是,后一个版本可能是不可移植的(即使对于实现定义的类型,编译器也必须知道大小)。这里的问题是什么?什么时候是memset(x, 0, sizeof x)不可移植的?
为什么ZeroMemory()在C标准库中存在memset和相关调用时,Windows API中存在类似的调用?我应该打电话给哪些人?我猜可以回答"依赖".什么?
我在eclipse中得到了一个无效的参数错误,尽管我相信我的论点是好的.建议的参数包含'?' 我认为这可能表明问题,但我不知道如何解决它.
我尽力复制我在这里看到的例子:http:
//www.cplusplus.com/reference/clibrary/cstring/memset/
为了确定我正确的args.
#include <stdio.h>
#include <string.h>
void foo()
{
char str[] = "why oh why does my IDE give me errors when I know my args are good?";
memset(str, '-', 4);
puts(str);
}
Run Code Online (Sandbox Code Playgroud)
Eclipse在memset行上给出了以下错误:
无效的参数'候选者是:void*memset(void*,int,?)'
可能是什么导致了这个?那是什么'?' 作为第3个arg?
提前致谢!
PS:刚刚注意到我在尝试使用malloc,calloc等操作时遇到了类似的错误.
为什么以下程序的输出84215045?
int grid[110];
int main()
{
memset(grid, 5, 100 * sizeof(int));
printf("%d", grid[0]);
return 0;
}
Run Code Online (Sandbox Code Playgroud) 我和一位同事进行了这次谈话,结果很有趣.假设我们有以下POD课程
struct A {
void clear() { memset(this, 0, sizeof(A)); }
int age;
char type;
};
Run Code Online (Sandbox Code Playgroud)
clear旨在清除所有成员,设置为0(按字节顺序).如果我们A用作基类会出现什么问题?这里有一个微妙的漏洞来源.
memset ×10
c++ ×6
c ×5
demoscene ×1
eclipse ×1
intrinsics ×1
performance ×1
pod ×1
portability ×1
string ×1
visual-c++ ×1
winapi ×1
windows ×1