void-pointers 相关问题

C和C ++中的void指针(void *)是一个指向没有指定类型的内存位置的指针。

如何在运行时创建实例,C

我需要用C语言创建几种数据结构之一的实例(例如:DynamicArray、BST、HashMap、Trie)。从文件中读取的数据结构的名称,然后是数据类型的实例...

回答 1 投票 0

c 程序的工作方式不同,但我没有改变它

我必须在c中实现动态数组。这是它的结构: typedef void (*PrintArrayElement)(const void* element); 类型定义结构{ size_t 尺寸; size_t 容量; 无效**数组;

回答 1 投票 0

void 指针的运行时转换

我正在编写一个 C 程序,根据环境变量对数组应用不同类型的量化。 问题是,我需要使用相同的函数 void foo(void* ptr, qu...

回答 1 投票 0

在 C 中创建泛型小于函数

我希望实现类似的东西 int memcmp ( const void * ptr1, const void * ptr2, size_t num ); 但要区分两种情况 (1) < and (2) =,> 而不是 我希望实现类似的东西 int memcmp ( const void * ptr1, const void * ptr2, size_t num ); 但要区分两种情况 (1) < and (2) =,> 而不是 (3)>。我的目标是减少使用的指令数量,假设在标准笔记本电脑(x86 架构)上运行。 问题的解决方案很可能就是#define less(a,b,n) (memcmp(a,b,n) < 0)。 使用 memcmp 有很多优点,因为编译器可能会高度优化它的使用。它可能会查看您用作输入的内容并相应地内联memcmp,从而给出最有效的代码。 例如,memcmp需要在内部将每个字节转换为unsigned char并处理未对齐的数据。但是,如果您在 x86_64 上提供两块 8 字节对齐的数据,则机器代码可能没有理由逐字节地咀嚼它。 这是一个例子,我将一个“less”函数的半天真版本拼凑在一起,其工作原理类似于memcmp: #include <string.h> #include <stdio.h> bool lesscmp (const void* obj1, const void* obj2, size_t size) { const unsigned char* o1 = (const unsigned char*)obj1; const unsigned char* o2 = (const unsigned char*)obj2; for(size_t i=0; i<size; i++) { if(o1[i] != o2[i]) { return o1[i] < o2[i]; } } return 0; } int main (void) { char s1[] = "This is some data"; char s2[] = "This is some other data"; printf("%d\n", memcmp(s1,s2,sizeof s1) < 0); printf("%d\n", memcmp(s2,s1,sizeof s1) < 0); printf("%d\n", memcmp(s1,s1,sizeof s1) < 0); printf("%d\n", lesscmp(s1,s2,sizeof s1)); printf("%d\n", lesscmp(s2,s1,sizeof s1)); printf("%d\n", lesscmp(s1,s1,sizeof s1)); } 在实现它时,我很快就意识到了一个问题:虽然我们正在寻找 < 结果,但我们必须在字节相等的情况下继续循环。当它们不存在时,我们就可以开始寻找 <,但需要进行额外的比较。 因为 C 没有像“use <= but store the less or equal statuses separately, so we can loop based on the equal flag but return the less flag". On the assembler level we can likely do that however, making this function a good candidate for inline assembler in case we care deeply about performance. And yet unless we happen to be some x86 assembler guru, we can probably not hope to beat the compiler even with hand-crafted assembler. 查看Compiler Explorer中生成的代码(gcc -O3 x86),我们可以得出结论,我自制的函数一团糟: lesscmp: test rdx, rdx je .L5 xor eax, eax jmp .L4 .L3: add rax, 1 cmp rdx, rax je .L5 .L4: movzx ecx, BYTE PTR [rsi+rax] cmp BYTE PTR [rdi+rax], cl je .L3 setb al ret .L5: xor eax, eax ret cmp到处都是——它的树枝比圣诞树还多!这根本不会表现得很好。 而等效的 memcmp 调用有时是内联的,导致各种奇特的 x86 内在函数、硬编码的“幻数”等以及很少的分支(如果有的话)。效率更高。 因此,结论是“过早的优化”仍然是万恶之源,而无论目标如何,memcmp(...) < 0都可能是实现此目的的最佳解决方案。

回答 1 投票 0

错误的通用 less then 函数

我假设以下函数可以获取任何数据类型,例如 float、double、long 和 long long 并返回正确答案。不幸的是,事实并非如此。谁能解释为什么?我的目标是...

回答 1 投票 0

创建通用 less then 函数

我希望实现类似的东西 int memcmp ( const void * ptr1, const void * ptr2, size_t num ); 但要区分两种情况 (1) < and (2) =,> 而不是 3

回答 1 投票 0

有没有一种解决方法可以将函数指针类型转换为 C 中的对象指针?

我有一个名为“bench”的函数,它接受一个返回 void 指针的函数指针(对于泛型)。 静态内联无符号长凳(void* (*funcPtr)(va_list), ...) 但如果我通过了...

回答 1 投票 0

在结构体中转换 void 指针

这就是我得到的.. typedef 结构 SysInfo_P { int some_P_int char some_P_char[10]; ... } 系统信息_P; typedef 结构 SysInfo_S { int some_S_int char some_S_char[10]; ... }

回答 2 投票 0

将 void* 转换为 std::function

我有一个问题。我正在尝试将 void* 转换为 std::function 。 这只是一个简单的例子,任何建议将不胜感激 #.h 文件 类示例{ 民众: 例子(); int foo(void* ...

回答 2 投票 0

“fwrite”手册页中的restrict 用法是什么意思?

我正在查找 fwrite 的手册页,并且我对参数限制的用法感到好奇,因为我以前从未见过这一点。 size_t fwrite(const void ptr[限制 .size * .nmemb]... 什...

回答 1 投票 0

iOS NSObject 和 UIViewController 类之间通信

我有两个类,class1是一个NSObject,class2是一个UIViewController... 我从 UIViewController 向 class1 发送了一些内容以使其执行操作: [class1 doVoidAction];...

回答 1 投票 0

将 void 指针转换为 2D 字符串数组指针

我正在使用一个库,它需要一个以 void* 指针作为参数的函数。我有一个 2D 字符串数组,我想通过该参数传递该数组并将其提取到函数内。我

回答 2 投票 0

插入最后一个元素时出现SkipList分段错误

我开发了一个带有void指针的SkipList,并以概率方式设置它的最大级别。 这些是我的结构: #包括 #包括 #包括

回答 1 投票 0

在 C++ 代码中用指针向量替换双指针变量时面临问题

我在代码中使用 C++ 11 标准。我已经使用双指针变量有一段时间了,现在我想用指针向量替换它。更换后,我得到了

回答 1 投票 0

编写没有特定返回类型的纯虚函数的正确方法是什么?

我尝试编写抽象结构形状,并且我需要派生类中的函数来计算从射线原点到我的形状的距离。我使用这里的函数,它们返回不同的类型。我这样做

回答 1 投票 0

可以将 _Atomic Type * 转换为 void * 并返回吗?

某些库要求回调函数采用 void *(不是 _Atomic void *)。是否可以将 _Atomic Type * 强制转换为 void * 并返回以使用它?就像下面的代码: #包括 某些库需要回调函数采用 void *(而不是 _Atomic void *)。是否可以将 _Atomic Type * 投射到 void * 然后再投射回来使用它?就像下面的代码: #include <stdio.h> int Call(int(*f)(void*), void *arg){ return f(arg); } int Use(void *arg){ return *(_Atomic int *)arg; } _Atomic int g_x; int main(int argc, const char **argv){ g_x = argc; int y = Call(Use, (void*)&g_x); printf("%d\n",y); } C 2018 6.3.2.3 1 说: 指向 void 的指针可以与指向任何对象类型的指针相互转换。指向任何对象类型的指针都可以转换为指向 void 的指针,然后再转换回来;结果应等于原始指针。 因此,仅将指针转换为 void * 并返回是没有问题的;该行为由 C 标准定义。此转换规范不会以任何方式限制原子类型。 有关原子类型的属性适用于访问原子对象。 (特别是,C 2018 6.7.2.4 4 说“与原子类型关联的属性仅对左值表达式有意义......”)只要 void * 不用于通过某些非原子类型访问对象,它对对象的使用没有影响。

回答 1 投票 0

如何向不带参数的函数(有参数)添加指针,并稍后使用自定义参数调用它们 C++

我会尽量保持简短。尽我所能。 我有一个法术类别,主要是持续时间、冷却时间、伤害、伤害类型等。 我有 SpellManager 类,应该实例化

回答 1 投票 0

转换 void* 指针

当我尝试在 C 语言的通用排序库中使用 compelx 结构时,我的代码出现问题: 我有一个二进制合并插入排序,它接受一个 void 指针(......的第一个元素)

回答 1 投票 0

Union 与 void 指针性能

TL;DR 在性能方面比 void 指针更好 当我搜索 Union 与 void 指针的性能时,我彻底解决了这个问题 Union 与 void 指针。 许多人建议...

回答 1 投票 0

从该类的实例调用 void(*vptr)() 指向的函数

这是 CSpellData.h 中的公共成员: void (CSpellData::* _vptr)(); 它在构造函数中被分配了一个回调,如下所示: _vptr = GetCallbackFromID(spell_id); 在哪里 无效(CSpellData::* CSpell...

回答 1 投票 0

© www.soinside.com 2019 - 2024. All rights reserved.