[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
Вы можете приблизить sizeof(bitset<N>)
как:
4 * ((N + 31) / 32)
8 * ((N + 63) / 64)
Кажется, что первое верно: 4 * ((3 + 31) / 32)
- 4
Я получаю вывод как 4. Каково объяснение этого?
blockquote>В стандарте нет информации о том, как
bitset
должно быть реализовано. Это определенная реализация, посмотрите наbitset header
вашего компилятора.Также существует метод выделения пространства в битах в C ++?
blockquote>Нет, там это не метод выделения пространства в битах в C ++.
Как правило, на 32-битном процессоре компилятор сделает размер выделенной памяти кратным 4 байтам, и поэтому ближайший кратный 4 больше 3/8 равен 4 байтам.
Ваш процессор не работает с отдельными битами, но с байтами и словами. В вашем случае sizeof (bits) приводит к 4, потому что компилятор решил выровнять эту структуру данных с 4 байтами.
Вы не можете адресовать отдельные биты, младшим адресным блоком является байт. Так что нет, вы не можете точно выделять биты.
Другое дело - заполнение - вы почти всегда получаете больше выделенных байт, которые вы просили, это для целей оптимизации. Адресация байтов не на границах 32b часто дорога, адресация байтов на процессоре x64, которые не находятся на границах 64b, приводит к исключению. (говоря о платформе Intel.)
(N + 31) / 32
? Спасибо. – Deqing 16 September 2013 в 09:004 * ((N + 31) / 32)
работала для меня при n = 3,40, но затем не удалась при n = 66. Кажется, здесь нет детерминированной формулы ... – ifelsemonkey 16 July 2018 в 14:05sizeof(std::bitset<66>)
не4 * (66+31)/32
, который равен 12? Возможно, выше некоторого числа (например, 66) - «ваш». битовый набор внутренне изменяется наuint64_t[]
массив - поэтому его размер равен8 * (66+63)/64
, который равен 16? – PiotrNycz 16 July 2018 в 16:23