前几天我遇到了sun.misc.Unsafe包裹,并对它能做什么感到惊讶.
当然,这门课没有证件,但我想知道是否有充分的理由使用它.您可能需要使用哪些场景?它如何在现实场景中使用?
此外,如果您确实需要它,那是否表明您的设计可能出现问题?
为什么Java甚至包括这个类?
为什么我会收到以下错误?
只有在使用/ unsafe进行编译时才会出现不安全的代码?
我在C#和Visual Studio 2008中工作,在Windows CE上进行编程.
我知道Java没有指针,但我听说Java程序可以用指针创建,这可以由少数java专家完成.这是真的吗?
我知道C#为程序员提供了访问的能力,在不安全的上下文中使用指针.但什么时候需要呢?
在什么情况下,使用指针变得不可避免?
是出于性能原因吗?
另外,为什么C#会通过不安全的上下文公开此功能,并从中删除所有托管优势?从理论上讲,是否可以使用指针而不会失去托管环境的任何优势?
我过去从不需要使用不安全的东西,但是现在我需要它来处理一个操纵位图的指针.
我找不到任何其他方面的文档,但我想更好地理解不安全是如何工作的,如果在循环内部或外部使用它会有什么不同.
做得更好:
unsafe
{
for (int x = 0; x < maxX; x++)
{
for (int y = 0; y < maxY; y++)
{
//Unsafe pointer operations here.
}
}
}
Run Code Online (Sandbox Code Playgroud)
还是做?:
for (int x = 0; x < maxX; x++)
{
for (int y = 0; y < maxY; y++)
{
unsafe
{
//Unsafe pointer operations here.
}
}
}
Run Code Online (Sandbox Code Playgroud) 我正在将C应用程序移植到C#中.C应用程序从第三方DLL调用许多函数,所以我在C#中为这些函数编写了P/Invoke包装器.其中的一些C函数分配,我有在C#应用程序使用的数据,所以就用IntPtr
的,Marshal.PtrToStructure
并且Marshal.Copy
到本机数据(数组和结构)复制到管理变量.
不幸的是,C#app被证明比C版慢得多.快速的性能分析表明,上述基于编组的数据复制是瓶颈.我正在考虑通过重写它以使用指针来加速C#代码.由于我没有C#中不安全的代码和指针的经验,我需要有关以下问题的专家意见:
unsafe
代码和指针而不是IntPtr
和Marshal
ing有什么缺点?例如,它是否以任何方式更不安全(双关语)?人们似乎更喜欢编组,但我不知道为什么.为了使情况更加清晰,我将一个小的示例代码(实际代码复杂得多)整合在一起.我希望这个例子说明我在谈论"不安全的代码和指针"与"IntPtr和Marshal"时的意思.
MyLib.h
#ifndef _MY_LIB_H_
#define _MY_LIB_H_
struct MyData
{
int length;
unsigned char* bytes;
};
__declspec(dllexport) void CreateMyData(struct MyData** myData, int length);
__declspec(dllexport) void DestroyMyData(struct MyData* myData);
#endif // _MY_LIB_H_
Run Code Online (Sandbox Code Playgroud)
MyLib.c
#include <stdlib.h>
#include "MyLib.h"
void CreateMyData(struct MyData** myData, int length)
{
int i;
*myData = (struct MyData*)malloc(sizeof(struct MyData));
if (*myData != NULL)
{
(*myData)->length = length; …
Run Code Online (Sandbox Code Playgroud) 在Java 8中,三个内存屏障指令被添加到Unsafe
类(源):
/**
* Ensures lack of reordering of loads before the fence
* with loads or stores after the fence.
*/
void loadFence();
/**
* Ensures lack of reordering of stores before the fence
* with loads or stores after the fence.
*/
void storeFence();
/**
* Ensures lack of reordering of loads or stores before the fence
* with loads or stores after the fence.
*/
void fullFence();
Run Code Online (Sandbox Code Playgroud)
如果我们用以下方式定义内存屏障(我认为或多或少容易理解):
考虑X和Y是要重新排序的操作类型/类,
X_YFence()
是一个内存屏障指令,它确保在屏障启动之后,在屏障完成任何操作之前,屏障之前的所有类型X操作都已完成.
我们现在可以将障碍名称"映射" Unsafe …
任何人都可以用简单的方式解释下面的代码:
public unsafe static float sample(){
int result = 154 + (153 << 8) + (25 << 16) + (64 << 24);
return *(float*)(&result); //don't know what for... please explain
}
Run Code Online (Sandbox Code Playgroud)
注意:上面的代码使用不安全的功能
对于上面的代码,我很难过,因为我不明白它的返回值与下面的返回值之间的区别是什么:
return (float)(result);
Run Code Online (Sandbox Code Playgroud)
如果你回来了,是否有必要使用不安全的功能*(float*)(&result)
?
构建示例可视化C++项目时出现此错误.首先我下载了3个样本项目,都解决了同样的问题,打印出所有小于N的素数(你可能知道这些样本项目吗?).我没有任何问题地构建了纯C项目.但是当我尝试构建基于程序集的项目时,我收到了这个错误.
谢谢.
unsafe ×10
c# ×5
java ×4
pointers ×2
.net ×1
c ×1
concurrency ×1
java-8 ×1
java-api ×1
marshalling ×1
performance ×1
pinvoke ×1
type-punning ×1
visual-c++ ×1
windows-ce ×1