使用 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 无符号) 字节值(即在 0
和 0xFF
之间)。
继续tool's answer - 您可以执行的一些有用的 memset'ing 相当于使用(无符号)整数将数组设置为 0 或 UINT_MAX
,即设置为 0xFFFF
或 0xFFFFFFFF
等,具体取决于 @ 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?