BitSet & л; 32 & GT; размер 8 байтов? [Дубликат]

[D9] Да. Ты можешь. На самом деле, не только std :: vector , std :: string , std :: wstring , любой стандартный класс C ++ или ваши собственные классы могут быть (d5) std :: vector & lt; any_type & gt; в C # действительно возможен с помощью обычного P / Invoke Interop, он сложный, хоть. даже std :: map любого типа можно сделать в C # /. NET.

  public class SampleClass: IDisposable {[DllImport («YourDll.dll»,  EntryPoint = «ConstructorOfYourClass», CharSet = CharSet.Ansi, CallingConvention = CallingConvention.ThisCall)] public extern static void SampleClassConstructor (IntPtr thisObject);  [DllImport («YourDll.dll», EntryPoint = «DestructorOfYourClass», CharSet = CharSet.Ansi, CallingConvention = CallingConvention.ThisCall)] public extern static void SampleClassDestructor (IntPtr thisObject);  [DllImport («YourDll.dll», EntryPoint = «DoSomething», CharSet = CharSet.Ansi, CallingConvention = CallingConvention.ThisCall)] public extern static void DoSomething (IntPtr thisObject);  [DllImport («YourDll.dll», EntryPoint = «DoSomethingElse», CharSet = CharSet.Ansi, CallingConvention = CallingConvention.ThisCall)] public extern static void DoSomething (IntPtr thisObject, int x);  IntPtr ptr;  public SampleClass (int sizeOfYourCppClass) {this.ptr = Marshal.AllocHGlobal (sizeOfYourCppClass);  SampleClassConstructor (this.ptr);  } public void DoSomething () {DoSomething (this.ptr);  } public void DoSomethingElse (int x) {DoSomethingElse (this.ptr, x);  } public void Dispose () {if (this.ptr! = IntPtr.Zero) {// Следующие 2 вызова равны «удалить объект» в C ++ // Вызов деструктора класса C ++ освободит память, выделенную родным  класс c ++.  SampleClassDestructor (this.ptr);  // Свободная память, выделенная из .NET.  Marshal.FreeHGlobal (this.ptr);  this.ptr = IntPtr.Zero;  }}}  

См. приведенную ниже ссылку,

C # /. NET PInvoke Interop SDK

(I Является автором инструмента SDK)

Как только у вас есть класс оболочки C # для вашего класса C ++, легко реализовать ICustomMarshaler , чтобы вы могли маршалировать объект C ++ из .NET.

http://msdn.microsoft.com/en-us/library/system.runtime.interopservices.icustommarshaler.aspx

8
задан Saurabh 17 September 2012 в 13:50
поделиться

5 ответов

Вы можете приблизить sizeof(bitset<N>) как:

  1. Если внутреннее представление 32bit (например, без знака в 32-битных системах) как 4 * ((N + 31) / 32)
  2. Если внутреннее представление - 64 бит ( как unsigned long на 64-битных системах) как 8 * ((N + 63) / 64)

Кажется, что первое верно: 4 * ((3 + 31) / 32) - 4

7
ответ дан PiotrNycz 16 August 2018 в 05:29
поделиться
  • 1
    Можете ли вы объяснить, почему это (N + 31) / 32? Спасибо. – Deqing 16 September 2013 в 09:00
  • 2
    @Deqing Это то, как можно оценить значение потолка для некоторого выражения Numberator / Denominator в целых числах. Чтобы получить ceil (N / D) - вам нужно использовать это выражение: (N + D - 1) / D. См. 31 == 32-1. Мне нужно предельное значение N / 32, поэтому я использую этот трюк, чтобы получить его ... – PiotrNycz 6 November 2013 в 17:30
  • 3
    формула 4 * ((N + 31) / 32) работала для меня при n = 3,40, но затем не удалась при n = 66. Кажется, здесь нет детерминированной формулы ... – ifelsemonkey 16 July 2018 в 14:05
  • 4
    @ifelsemonkey - вы имеете в виду, что sizeof(std::bitset<66>) не 4 * (66+31)/32, который равен 12? Возможно, выше некоторого числа (например, 66) - «ваш». битовый набор внутренне изменяется на uint64_t[] массив - поэтому его размер равен 8 * (66+63)/64, который равен 16? – PiotrNycz 16 July 2018 в 16:23
  • 5
    @ifelsemonkey - в любом случае - мы не можем на 100% предсказать размер бита & lt; N & gt; - поскольку его внутреннее представление может измениться только потому, что новая версия библиотеки std выбирает другое внутреннее представление. Поэтому мой ответ - это только приближение реального значения (я использовал этот глагол). – PiotrNycz 16 July 2018 в 16:30

Я получаю вывод как 4. Каково объяснение этого?

В стандарте нет информации о том, как bitset должно быть реализовано. Это определенная реализация, посмотрите на bitset header вашего компилятора.

Также существует метод выделения пространства в битах в C ++?

Нет, там это не метод выделения пространства в битах в C ++.

7
ответ дан ForEveR 16 August 2018 в 05:29
поделиться

Как правило, на 32-битном процессоре компилятор сделает размер выделенной памяти кратным 4 байтам, и поэтому ближайший кратный 4 больше 3/8 равен 4 байтам.

1
ответ дан jrtc27 16 August 2018 в 05:29
поделиться

Ваш процессор не работает с отдельными битами, но с байтами и словами. В вашем случае sizeof (bits) приводит к 4, потому что компилятор решил выровнять эту структуру данных с 4 байтами.

7
ответ дан Juho 16 August 2018 в 05:29
поделиться

Вы не можете адресовать отдельные биты, младшим адресным блоком является байт. Так что нет, вы не можете точно выделять биты.

Другое дело - заполнение - вы почти всегда получаете больше выделенных байт, которые вы просили, это для целей оптимизации. Адресация байтов не на границах 32b часто дорога, адресация байтов на процессоре x64, которые не находятся на границах 64b, приводит к исключению. (говоря о платформе Intel.)

0
ответ дан nothrow 16 August 2018 в 05:29
поделиться
Другие вопросы по тегам:

Похожие вопросы: