有像C和C++的_aligned_malloc
这样的函数,但是我找不到任何东西来对齐内存中的.NET对象。有没有一种方法可以将new对齐为64字节的.NET对象?
2
A
回答
0
更正 - 您需要创建一个P/Invocable DLL,然后调用它来执行aligned_malloc函数。样品C++代码
#include <malloc.h>
extern "C" {
__declspec(dllexport) void* alMlc(size_t size, size_t alginment) {
return _aligned_malloc(size,alginment);
}
}
C#代码(假设你创建的DLL被称为mallocer.dll)
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.InteropServices;
namespace ConsoleApplication7
{
class Program
{
[DllImport("mallocer.dll", CallingConvention=CallingConvention.Cdecl)]
static extern IntPtr alMlc(int size, int alignment);
static void Main(string[] args)
{
unsafe
{
//Allocate exactly 64 bytes of unmanaged memory, aligned at 64 bytes
char* str = (char*)alMlc(64,64).ToPointer();
str[0] = 'H';
str[1] = 'i';
str[2] = '!';
str[3] = '\0';
Console.WriteLine(System.Runtime.InteropServices.Marshal.PtrToStringAuto(new IntPtr(str)));
}
Console.ReadKey();
}
}
}
3
不可能在一般情况下,以有效地对准.NET对象上的64-因为即使对象在64位边界上开始,也不能保证它不会被重新定位到32位的奇数倍。出于某种原因,.net似乎认为值得强制将超过一千个double
值的数组添加到大对象堆中,该大堆对象始终是64位对齐的,但是否则可怕,而且没有提供请求64位的有用方法即使这样做不应该困难或昂贵(在gen0中四舍五入对象大小;当将对象移动到较高编号的世代时,将奇数大小的对象配对)。
相关问题
- 1. 有没有一种方法可以轻松地将平面DataTable转换为嵌套的.NET对象?
- 2. 有没有一种方法可以将所有对象声明为类的字段的装饰器/拦截器?
- 3. 有没有什么方法可以将Ember对象转换为纯javascript对象?
- 4. 有没有一种方法可以知道谁拥有对象的引用?
- 5. 有没有一种方法可以以编程方式将几何对象表示为maya中的值?
- 6. 有没有一种方法可以将argseparse模块转换为某种类型的对象?
- 7. 对象[对象对象]没有方法'可拖动'为什么?
- 8. 对象[对象数组]或[Object对象]有没有一种方法“然后”
- 9. 有没有一种方法可以轻松映射Ruby中的对象?
- 10. 有没有一种方法可以获得给定$$ hashKey的DOM对象?
- 11. 有没有一种方法可以将网页转换为pdf?
- 12. 有没有一种方法来一次为多个对象设置方法?
- 13. 有没有一种方法可以免费安装.NET 3.5 SP1?
- 14. 有没有一种方法可以为RichTextBox中的一段文本指定完整对齐?
- 15. .NET有没有一种方法来发现COM对象的成员
- 16. 在WPF中,有没有一种方法可以像Grid一样制作一个具有对齐列的StackPanel?
- 17. 有没有一种方法可以在node.js中的对象字面值中指定ES6生成器方法?
- 18. 有没有一种方法可以在不知道其节俭类型的情况下将原始字节[]反序列化为节俭对象?
- 19. 有没有一种工具可以在运行过程中检查.NET对象?
- 20. TokuMX对象的翻译:有没有一种方法“hasNext”
- 21. 有没有一种方法来结合在Javascript中的对象
- 22. 有没有一种方法可以为定义__call__的python对象定义文档字符串?
- 23. Java将对象转换为字节数组的有效方法
- 24. 有没有一种方法可以将.net上的foreach组合起来?
- 25. 创建JavaScript对象有3种方法抛出对象没有方法
- 26. 是否有一种方法可以将HttpServletRequest对象作为属性传递给另一个HttpServletRequest对象
- 27. Dlang - 有没有将对象嵌入对象的方法?
- 28. 有没有一种方法可以将对象设置为重叠并符合网格系统?
- 29. 对象有没有一种方法使用
- 30. django有没有一种方法来注释嵌套对象?
你为什么要使用C#但要关心内存级别的问题?高级语言的要点是将这些东西抽象出来。 – mellamokb 2012-04-20 03:02:21
C#是一种托管语言。 CLR管理所有与内存有关的方面,所以你不必担心它们。 – dtb 2012-04-20 03:02:47
.NET具有字段对齐属性。显然他们提供了一些控制记忆相关方面的设施。 – 2012-04-20 03:05:18