使用 memset 和 int 值初始化整数数组 - 失败

Posted

技术标签:

【中文标题】使用 memset 和 int 值初始化整数数组 - 失败【英文标题】:Initializing an integer array using memset and an int value - fails 【发布时间】:2012-06-21 09:10:36 【问题描述】:

我正在为 CUDA 程序编写主机代码,所以我无法使用标准 C 函数。我在使用 memset 函数初始化整数数组的元素时遇到问题。我的印象是你可以使用memset 来初始化一个整数数组,例如,像这样的所有 4:

int num_elements = 10;
int* array_example = (int*)malloc(num_elements * sizeof(int));
memset(array_example, 4, sizeof(array_example));

但是当我这样做时,它将每个字节设置为 4,而不是每个 int。如果我说:

memset(array_example, 4, 1);

我在第一个整数中得到一个 4,如果我说:

memset(array_example, 4, 2);

我在第一个整数中得到 1024,在第二个整数中得到 0。我了解memset 函数将第三个参数中指定的字节数设置为 4,但是有没有办法使用 memset 将每个整数设置为 4 而不是每个字节?否则,我是否会使用 for 循环?我的 GPU 的计算能力很低,因此我无法访问一些更好的 CUDA 附加功能,这些功能允许更多的 C++ 使用。

【问题讨论】:

【参考方案1】:

如果您知道表格的大小并希望将每个元素设置为某个值,您可以随时编写:

int array[10] =  4, 4, 4, 4, 4, 4, 4, 4, 4, 4 ;

如果你使用 gcc,你也可以这样做:

int array[10] = [0 ... 9] = 4;

当您必须动态分配数组时,我怀疑是否有任何替代解决方案,然后只使用一个简单的循环。

【讨论】:

【参考方案2】:

尽管我会添加一个选项并贡献几点:

    如果您使用 C++ 而不是 C,请尝试使用通用的 std::fill() - 并让编译器担心优化:

     std::fill_n(my_array, array_length, constant_value);
    

    memset()的签名是:

     void *memset(void *s, int c, size_t n);
    

    虽然它假定需要一个 int,但它实际上需要一个 (n 无符号) 字节值(即在 00xFF 之间)。

    继续tool's answer - 您可以执行的一些有用的 memset'ing 相当于使用(无符号)整数将数组设置为 0 或 UINT_MAX,即设置为 0xFFFF0xFFFFFFFF 等,具体取决于 @ 987654334@.

    如果我们有strided memset(),您可以应用其中的四个来将 4 字节整数设置为数组。然而,我们不这样做,事实上,目前这样做似乎比仅仅循环没有任何优势。

【讨论】:

【参考方案3】: 如果考虑到 int 本身的表示(例如 2-补码),表示 int 值的位具有逐字节常量的模式,则可以成功使用 memset(不是幸运问题)。

例如,如果您将数组设置为 4,则结果是每个 int 都使用 0x04040404 进行初始化(考虑 sizeof(int)=32),这取决于您的需要是否可以。

这适用于一些特定值的初始化值,为整数。

但这导致代码几乎不能移植。

如果要将每个 int 初始化为零,它应该始终有效。

【讨论】:

【参考方案4】:

没有写入整数的标准替代 memset。您必须编写一个循环。

【讨论】:

好的,谢谢。我继承了一个超过 5000 行的程序来进行医学成像研究,他们到处使用memset,就好像它可以初始化每个整数一样。他们的代码有效,所以我试图弄清楚我是否遗漏了什么,或者他们幸运地重写了垃圾初始化。

以上是关于使用 memset 和 int 值初始化整数数组 - 失败的主要内容,如果未能解决你的问题,请参考以下文章

为啥“memset(arr, -1, sizeof(arr)/sizeof(int))”不能将整数数组清除为-1?

为啥“memset(arr, -1, sizeof(arr)/sizeof(int))”不能将整数数组清除为-1?

关于memset()

数组初始化及赋值的方法,memset的使用

使用 memset 初始化整数数组而不是像 array[10]=0 这样的默认零初始化是不是有任何性能优势?

memset为int型数组初始化问题