标签: memset

memset()比C中的循环效率更高吗?

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 performance memset

34
推荐指数
4
解决办法
2万
查看次数

如何使用没有运行时库的VC++内部函数

我参与了其中一个挑战,你试图生成尽可能小的二进制文件,所以我在没有 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)

c++ demoscene memset intrinsics visual-c++

32
推荐指数
2
解决办法
2万
查看次数

将布尔设置为0安全吗?

假设我有一些遗留代码,除非发现错误,否则无法更改,并且它包含以下代码:

bool data[32];
memset(data, 0, sizeof(data));
Run Code Online (Sandbox Code Playgroud)

这是bool将数组中的所有false值设置为值的安全方法吗?

更一般地,是安全的memsetbool0,以使其价值false

是否保证可以在所有编译器上运行?或者我是否要求修复?

c++ memset language-lawyer

32
推荐指数
4
解决办法
4275
查看次数

在c中使用整数数组的memset

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)

c memset

29
推荐指数
4
解决办法
7万
查看次数

如何在C ++中使用memset?

我来自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?

进一步的研究此处
提供了具有缺点的优秀教程memsethttps : //web.archive.org/web/20170702122030/https …

c++ string initialization memset string-literals

28
推荐指数
4
解决办法
3599
查看次数

什么时候 memset 为 0 不可移植?

来自GCC bug #53119 中的评论

在 C 中,{0}通用零初始值设定项与 C++ 的通用零初始值设定项等效{}(后者在 C 中无效)。每当您想要一个完整但概念上不透明或实现定义类型的零初始化对象时,就有必要使用它。C 标准库中的经典示例是mbstate_t

mbstate_t state = { 0 }; /* correctly zero-initialized */
Run Code Online (Sandbox Code Playgroud)

与常见但不可移植的相比:

mbstate_t state;
memset(&state, 0, sizeof state);
Run Code Online (Sandbox Code Playgroud)

让我感到奇怪的是,后一个版本可能是不可移植的(即使对于实现定义的类型,编译器也必须知道大小)。这里的问题是什么?什么时候是memset(x, 0, sizeof x)不可移植的?

c portability memset

26
推荐指数
2
解决办法
1406
查看次数

为什么存在memset等时存在ZeroMemory等?

为什么ZeroMemory()在C标准库中存在memset和相关调用时,Windows API中存在类似的调用?我应该打电话给哪些人?我猜可以回答"依赖".什么?

c c++ windows winapi memset

25
推荐指数
6
解决办法
2万
查看次数

Eclipse给我无效的参数'候选者是:void*memset(void*,int,?)'虽然我知道args是好的

我在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等操作时遇到了类似的错误.

eclipse memset

25
推荐指数
3
解决办法
3万
查看次数

为什么memset()错误地初始化int?

为什么以下程序的输出84215045

int grid[110];
int main()
{
    memset(grid, 5, 100 * sizeof(int));
    printf("%d", grid[0]);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

c c++ memset

24
推荐指数
4
解决办法
1万
查看次数

为什么使用这个POD结构作为基类是危险的?

我和一位同事进行了这次谈话,结果很有趣.假设我们有以下POD课程

struct A { 
  void clear() { memset(this, 0, sizeof(A)); } 

  int age; 
  char type; 
};
Run Code Online (Sandbox Code Playgroud)

clear旨在清除所有成员,设置为0(按字节顺序).如果我们A用作基类会出现什么问题?这里有一个微妙的漏洞来源.

c++ pod memset

23
推荐指数
2
解决办法
1164
查看次数