は、CおよびCのための_aligned_malloc
のような機能があります++が、私はメモリ内の.NETオブジェクトを整列させるための何かを見つけることができません。64バイトに整列された.NETオブジェクトを `new`する方法はありますか?
2
A
答えて
0
CORRECTION - あなたは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
それは有益64上の.NETオブジェクトを整列させる一般的なケースでは可能ではありませんオブジェクトが64ビット境界から始まっても、32ビットの奇数倍に再配置されないという保証はないからです。何らかの理由で、.NETは、それは常に64ビットの整列であるが、それ以外は恐ろしいです、まだ64ビットを要求する有用な手段を提供していないラージオブジェクトヒープに超える千double
値の配列を強制的に価値があると考えているようですそのようにすることは困難でも費用もかかりませんが(他のオブジェクトを高次の世代に移動するときは、奇数サイズのオブジェクトをペアにするときにgen0のオブジェクトサイズを切り上げるべきではありません)。
関連する問題
- 1. Interop.Word.Documentオブジェクトをストリームまたはバイト配列に変換する方法はありますか
- 2. 整数値を表示するために、バイト配列を整数に変換してから文字列に変換する方法はありますか?
- 3. デスクトップ上でテキストを整列させる方法はありますが、小さなデバイスでテキストを整列する方法はありますか?
- 4. オブジェクト#をバイト[]に変換するのに、バイトオブジェクトをバイトとして保持する方法はありますか?
- 5. には、SQL Server 2008で調整された行あたりの8060バイトの制限がありますか?
- 6. .NET XsltArgumentList - パラメータを数えたり列挙する方法はありますか?
- 7. ラベルをコントロールの上部に整列させる方法はありますか?
- 8. バイト配列をPySharkデータフレームに変換する方法はありますか?
- 9. バイト文字列がピクルされたオブジェクトであるかどうかを識別する方法?
- 10. Javaでガベージコレクションされたオブジェクトを確認する方法はありますか?
- 11. pyPortMidiをWin7-64で動かす方法はありますか?
- 12. TypeErrorを修正する方法:期待される文字列またはバイト様のオブジェクトですか?
- 13. パラメータに応じて 'new XXXX'を使用する方法はありますか?
- 14. バイト配列のバイト配列を照合する簡単な方法はありますか?
- 15. PHPで整数からバイト配列に変換する方法
- 16. レンダリングされた文字列を指定すると、DOMオブジェクトを作成する方法はありますか?
- 17. 32ビット.NETアプリケーションと64ビット.NETアプリケーションに違いはありますか?
- 18. オブジェクト内にネストされた配列をループする方法はありますか?
- 19. .NET Remoting:サーバー上のオブジェクトをアクティブ(リモート)する方法はありますか?
- 20. specflowテストを.Netで並列に実行する方法はありますか?
- 21. mysqlに4バイトまたは8バイトの代わりに整数を格納するためにNバイトを割り当てる方法は?
- 22. Python 3.6+にフォーマットされたバイト文字列リテラルがありますか?
- 23. pdfファイルをバイト配列に変換する方法、フレックスデスクトップアプリケーションでバイト配列をpdfファイルに取り込む方法はありますか?
- 24. .NETにHTMLオブジェクトを管理するクラスはありますか?
- 25. "new"を使わずにScalaオブジェクトを初期化する方法はありますか?例えば
- 26. Tensorflow:TypeError:予想される文字列またはバイト状のオブジェクト
- 27. 期待される文字列またはバイト状のオブジェクト
- 28. TypeError:予想される文字列またはバイト様オブジェクト(Python)
- 29. バイト配列を整数値に変換する方法
- 30. ネストされたオブジェクトを外側のオブジェクトにシフトする方法はありますか?
なぜあなたは、C#を使用しますが、メモリレベルの問題を気にするのでしょうか?これらの種類のものを抽象化することは、高水準言語の全体のポイントです。 – mellamokb
C#は管理された言語です。 CLRは、すべてのメモリ関連の面を管理しているため、心配する必要はありません。 – dtb
.NETにはフィールドアライメント属性があります。明らかに、メモリ関連の側面を制御するためのいくつかの機能を提供します。 –