Эквивалент C ++ sizeof (uint64Array) в C#? - PullRequest
2 голосов
/ 08 апреля 2020

В этом коде: http://prng.di.unimi.it/xoshiro256plus.c Они делают это:

static const uint64_t JUMP[] = { 0x180ec6d33cfd0aba, 0xd5a61266f0c9392c, 0xa9582618e03fc9aa, 0x39abdc4529b1661c };

 for(int i = 0; i < sizeof JUMP / sizeof *JUMP; i++)

Что означает sizeof JUMP / sizeof * JUMP и как его переносить на c#?

размер прыжка кажется Marshal.Sizeof (JUMP) согласно https://docs.microsoft.com/fr-fr/dotnet/api/system.runtime.interopservices.marshal.sizeof?view=netframework-4.8

Но Marshal.Sizeof (* JUMP) нельзя использовать в безопасном режиме, и я не могу использовать небезопасный код.

И в соответствии с этой страницей: https://en.cppreference.com/w/cpp/language/sizeof size of JUMP / sizeof * JUMP возвращает длину массива. Так почему бы не поставить 4 вместо длины JUMP?

Спасибо.

Ответы [ 2 ]

4 голосов
/ 08 апреля 2020

почему бы просто не указать 4 вместо длины JUMP, известной

, потому что в отличие от массивов C#, вы не можете просто получить доступ к свойству Length массива в C ++. Да, 4 - правильный ответ сегодня но что, если кто-то отредактирует массив позже и в нем будет 3 или 5 записей? Они также должны помнить, чтобы редактировать for.

3 голосов
/ 08 апреля 2020

Что означает размер JUMP / sizeof * JUMP и как его перенести на c#?

sizeof JUMP / sizeof * JUMP - это размер в байтах от общего массива, разделенный по размеру первого элемента массива. Это дает вам длину массива.

Это то же самое, что и запись размера JUMP / sizeof JUMP [0]

В C# вы просто пишете "JUMP.Length"

for (int i = 0; i < JUMP.Length; i++)
{
}

Для sidenote у вас ограниченный размер возможностей в C#:

using System.Runtime.InteropServices;

    long[] arr = new long[10];

    Console.WriteLine("" + Marshal.SizeOf(arr[0]));

Так что вы можете перевести * JUMP в JUMP [0]

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...