- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想知道 C# 7.3's Unmanaged type constraint提供语言支持以强制类型可 blittable。根据Blittable and Non-Blittable types正确地进行平台调用需要断言返回类型是 blittable:
Structures that are returned from platform invoke calls must be blittable types. Platform invoke does not support non-blittable structures as return types.
然而,官方文档似乎没有在任何地方说明 C# 强制 unmanaged
类型是“blittable”。我很担心这样假设,因为有证据表明,至少在某个时候,一个类型是否“可复制”只能凭经验确定。
The C# 7.3 "Unmanaged type constraint" proposal包括以下内容:
The unmanaged constraint feature will give language enforcement to the class of types known as "unmanaged types" in the C# language spec. ...
...
Blittable vs. Unmanaged
The F# language has a very similar feature which uses the keyword unmanaged. The blittable name comes from the use in Midori. May want to look to precedence here and use unmanaged instead.
Resolution The language decide to use unmanaged
...
此处的短语“非托管类型”似乎指的是 Unsafe code - Pointer Types of the draft C# 6 specification 中定义的“unmanaged_type” (我没有在 the C# 5 ECMA standard 中找到类似的引用资料)。 unmanaged_type 定义如下:
An unmanaged_type is any type that isn't a reference_type or constructed type, and doesn't contain reference_type or constructed type fields at any level of nesting. In other words, an unmanaged_type is one of the following:
sbyte
,byte
,short
,ushort
,int
,uint
,long
,ulong
,char
,float
,double
,decimal
, orbool
.- Any enum_type.
- Any pointer_type.
- Any user-defined struct_type that is not a constructed type and contains fields of unmanaged_types only.
我没有找到 interop marshaling documentation 中提到的 C# 7.3 的 unmanaged
类型约束;该文档似乎早于该功能。
Blittable and Non-blittable Types指出以下内容是可复制的:
System.Byte
, System.SByte
, System.Int16
, System.UInt16
, System.Int32
, System.UInt32
, System.Int64
, System.UInt64
, System.IntPtr
>、System.UIntPtr
、System.Single
、System.Double
非托管
类型都是“Blittable”?起初我认为上面的定义意味着每个 unmanaged
类型都是“blittable”。但是我还没有找到任何官方文件来说明这一点。我找到的最接近的是 this reply从(据我了解时间线)在 unmanaged
类型约束功能实现之前:
How is this related to Blittable Types in Interop Marshaling? The same? or similar but bit different?
都是一样的
这似乎是肯定的证据,但它也是作为设计决策基础的相当薄弱的证据。 (FWIW,这种交换也可以解释为所有“blittable”类型都是 unmanaged
的意思,这似乎不太可能是真的。)
根据文档,bool
不是“blittable”,System.Boolean
是unmanaged
。那个并发症is acknowledged but not directly addressed for the interop marshaler in the original proposal.
我不是一名活跃的 C# 开发人员,而这方面的历史似乎已经展开,并且肯定有我错过的线索。在我发现的线索中,很多都是负面的;似乎曾经有一段时间,P/Invoke 的实现抵制了区分 blittable 和 non-blittable 类型的总内涵定义。换句话说,至少在某些 C# 版本中,先验 确认互操作编码(marshal)拆收器是否认为某个类型是可 blittable 是非常重要的(或者可能是不可能的)。或者至少看起来是这样。例如,Hans Passant wrote in 2015
There is no easy way to find out if a type is blittable, other than it not working correctly or by using the debugger and compare pointer values.
另一个线索是 The fastest way to check if a type is blittable? 中的每个答案的方法(2012 年提出)似乎是经验性的。这似乎是进一步的负面证据。
我想可能所有 unmanaged
类型都是“blittable”但并非所有“blittable”类型都是 unmanaged
。但这只是我的猜测。
最佳答案
Hans Passant confirmed the answer in the negative.
No, simplest counter-example is a struct with a bool field. Never blittable, okay to meet the constraint...
这似乎是得出答案是否定结论的充分依据。
我认为 Hans 回答的第二部分更有趣:
It just doesn't make sense to mix the concepts...
这与我对其他似乎暗示 unmanaged
和“blittable”是“相同”的观点的解释相反。我没有找到任何关于 Hans 认为混合 unmanaged
和“blittable”概念没有意义的观点的详细说明。但我已经形成了自己的观点。
术语“blittable”对于不同的人和不同的上下文似乎意味着略有不同的东西(example 1,2)。我将使用 here 中的以下定义对于此答案的其余部分:
Blittable types are types that have the same bit-level representation in managed and native code. As such they do not need to be converted to another format to be marshaled to and from native code...
根据上述定义,一个类型是否可“blittable”取决于与您交换数据的对应代码是否以与您的代码相同的方式解释类型的位。 bool
和 BOOL
提供了一个很好的例子:
BOOL
定义为 int
和 MSVC's int
是 32 位宽。bool
的位从 .Net 写入文件,例如,读取这些相同的位bool
不需要转换;任何 .Net 程序都将以相同的方式解释此类 bool 值的位。bool
和 win32 的 BOOL
按位表示之间的大小差异,在这些域之间交换 bool 值需要转换。如果不进行转换,发出 BOOL
的 win32 API 只能设置最重要的 24 位中的位来传达 true,而 .Net 可能会将其解释为 bool
false。从 C# 的角度来看,一个类型是否可 blittable 取决于对应代码是否碰巧以相同的方式解释表示该类型的位。这将因交易对手而异。在 .Net 与 .Net 对手方交换数据的情况下,unmanaged
提供了一个约束,保证表示类型的位将被双方正确解释。
对于 .Net 以外的交易对手,目前不存在此类类似的语言限制。而且我不希望 C# 中存在这样的约束;交易对手很多,他们对表示其类型的位的解释肯定是以 C# 规范无法依赖的方式定义的。
关于c# - C# 是否强制 `unmanaged` 类型为 "blittable"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65833341/
#include using namespace std; class C{ private: int value; public: C(){ value = 0;
这个问题已经有答案了: What is the difference between char a[] = ?string?; and char *p = ?string?;? (8 个回答) 已关闭
关闭。此题需要details or clarity 。目前不接受答案。 想要改进这个问题吗?通过 editing this post 添加详细信息并澄清问题. 已关闭 7 年前。 此帖子已于 8 个月
除了调试之外,是否有任何针对 c、c++ 或 c# 的测试工具,其工作原理类似于将独立函数复制粘贴到某个文本框,然后在其他文本框中输入参数? 最佳答案 也许您会考虑单元测试。我推荐你谷歌测试和谷歌模拟
我想在第二台显示器中移动一个窗口 (HWND)。问题是我尝试了很多方法,例如将分辨率加倍或输入负值,但它永远无法将窗口放在我的第二台显示器上。 关于如何在 C/C++/c# 中执行此操作的任何线索 最
我正在寻找 C/C++/C## 中不同类型 DES 的现有实现。我的运行平台是Windows XP/Vista/7。 我正在尝试编写一个 C# 程序,它将使用 DES 算法进行加密和解密。我需要一些实
很难说出这里要问什么。这个问题模棱两可、含糊不清、不完整、过于宽泛或夸夸其谈,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开,visit the help center . 关闭 1
有没有办法强制将另一个 窗口置于顶部? 不是应用程序的窗口,而是另一个已经在系统上运行的窗口。 (Windows, C/C++/C#) 最佳答案 SetWindowPos(that_window_ha
假设您可以在 C/C++ 或 Csharp 之间做出选择,并且您打算在 Windows 和 Linux 服务器上运行同一服务器的多个实例,那么构建套接字服务器应用程序的最明智选择是什么? 最佳答案 如
你们能告诉我它们之间的区别吗? 顺便问一下,有什么叫C++库或C库的吗? 最佳答案 C++ 标准库 和 C 标准库 是 C++ 和 C 标准定义的库,提供给 C++ 和 C 程序使用。那是那些词的共同
下面的测试代码,我将输出信息放在注释中。我使用的是 gcc 4.8.5 和 Centos 7.2。 #include #include class C { public:
很难说出这里问的是什么。这个问题是含糊的、模糊的、不完整的、过于宽泛的或修辞性的,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开它,visit the help center 。 已关
我的客户将使用名为 annoucement 的结构/类与客户通信。我想我会用 C++ 编写服务器。会有很多不同的类继承annoucement。我的问题是通过网络将这些类发送给客户端 我想也许我应该使用
我在 C# 中有以下函数: public Matrix ConcatDescriptors(IList> descriptors) { int cols = descriptors[0].Co
我有一个项目要编写一个函数来对某些数据执行某些操作。我可以用 C/C++ 编写代码,但我不想与雇主共享该函数的代码。相反,我只想让他有权在他自己的代码中调用该函数。是否可以?我想到了这两种方法 - 在
我使用的是编写糟糕的第 3 方 (C/C++) Api。我从托管代码(C++/CLI)中使用它。有时会出现“访问冲突错误”。这使整个应用程序崩溃。我知道我无法处理这些错误[如果指针访问非法内存位置等,
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 我们不允许提问寻求书籍、工具、软件库等的推荐。您可以编辑问题,以便用事实和引用来回答。 关闭 7 年前。
已关闭。此问题不符合Stack Overflow guidelines 。目前不接受答案。 要求我们推荐或查找工具、库或最喜欢的场外资源的问题对于 Stack Overflow 来说是偏离主题的,因为
我有一些 C 代码,将使用 P/Invoke 从 C# 调用。我正在尝试为这个 C 函数定义一个 C# 等效项。 SomeData* DoSomething(); struct SomeData {
这个问题已经有答案了: Why are these constructs using pre and post-increment undefined behavior? (14 个回答) 已关闭 6
我是一名优秀的程序员,十分优秀!