2016-05-26 14 views
5

BenBir GSL açıklığı ile değiştirmem (void *, size)?

int foo(void* p, size_t size_in_bytes); 

var ve duyu foo yazmış olmak için yapmaz varsayalım varsayalım. İyi bir kodlayıcı olmak ve C++ temel kurallarını uygulamak istiyorum. Özellikle, (*, len) çiftleri yerine yaymak istiyorum. Eh, span<void> derlenmez (bir void *'a eklenemez); ve span<char> ya da span<uint8_t> vb., foo'nun aslında yapamayacağı karakterleri beklediğini ima eder.

Bu durumda span<something-with-size-1> kullanmalı mıyım yoksa void* ile mi yapıştırılmalı?

+2

İşlev şablonunu doğru tipte yap? – Jarod42

+0

Şablon int foo (T &&) 'yapar. –

+0

@ Jarod42: Doğru bir tür olduğunu varsayalım. İşlev, arabelleğin bellek alanı içindeki bir bölgeyle kesişip kesişmediğini, yani bir dosyayla eşlenip eşlenmediğini kontrol ederse ne olur? – einpoklum

cevap

0

Yapmam seçti Ne ve ne Bence biz ses, bunu örneğin dolayısıyla gsl::span (type-inspecific işlevselliğe sahiptir memory_region adında bir sınıf uygulamak tasarım akıllıca diyelim, olduğu başlangıç ​​() veya bir sonu() yok. Bu, numaralı değil, bir bayt, IMO yayılımı ile aynı şeydir ve yapısal olarak bunları asla karıştırmam.

İşte bu benim implementation (bu bir DBMS ile ilişkili GPU çekirdeklerinin bir havuzunun bir parçası ve üzerinde çalıştığım bir test çerçevesi, dolayısıyla CUDA ile ilişkili snippet'in bir parçasıdır ve benim durumumda bazı GSL'ye bağlıdır gsl-lite tarafından MS'lerin de iyi olması gerektiğini düşünüyorum).

5

Bu sorunun genel bir yanıtı olamaz.

Bir işlevinin, bir span<T> gerektirdiğini söylemesi, herhangi bir sahiplik aktarımı olmadan bitişik bir değerler dizisi alması anlamına gelir. Bu açıklama ne olup bittiğini makul bir şekilde temsil etmiyorsa, o zaman span<T> almamalıdır. Örneğin

:

Ne tampon bir dosyaya eşlenen diyelim ki, benim hafıza alanı, bir bölge kesişiyor olup olmadığını fonksiyon kontrolleri olur?

Bu, span<T> gibi görünmüyor.

struct memory_region 
{ 
    void* p; 
    size_t size_in_bytes; 
}; 

Hatta kavşakları test etmek için bunu bir üye işlev verebilir: ne anlama açıkça kılan bir adla basit agrega olmalıdır gibi geliyor. Eğer bu tür hafıza bölgeleriyle uğraşmak için bir sistem yapıyorsanız, kurucular ve benzerleri ile daha kapsüllenmiş bir sınıf türü tavsiye edebilirim.

İşlev ne tür bir işlevin ne anlama geldiğini açıklamalıdır. Tercihen bu anlam genel anlamda olacaktır, fakat en azından, söz konusu işlev için ne anlama geldiğini söylemelidir.


Bir şey daha:

veya span<uint8_t> vb foo ima aslında karakter

Hayır

, değil mi bekler. uint8_t neredeyse unsigned char ile aynı boyuta sahip olsa da, bu bir karakter dizisini span<uint8_t> alan herhangi bir işleve iletebilmeyi bekleyeceği anlamına gelmez. Bu işlev kabul edilen karakterleri tanıtmak istediyse, unsigned char kullanmış olur.

Ben fonksiyonu whatever 's beklemek ima span<whatever> demek istedim.

Evet, span s için şartı verilen boyutta T s, gerçek bir dizi geçirilir olmasıdır.

+0

' 'span ' fonksiyonunu ifade eder. 'ne olursa olsun' bekliyor ... – einpoklum

0

C++ standardizasyon komitesi önünde teklifi, (insanlar etrafında void* geçerken yapmak istediğim şey genellikle) bayt dizisi bir işaretçi etrafında geçirmek istiyorsanız, o zaman güvenir, hangi bir span<std::byte> geçerdi olmasıdır Yeni bir std::byte türü üzerine. Ancak, bu dil standardının yasal olması için küçük bir değişiklik gerektirir.

Günümüzün C++'sında, span<unsigned char> (en açıklayıcı bulduğunuz şekilde yazılmıştır) geçiş yapabilir ve aynı efekti elde edebilirsiniz: bayt dizisine erişim.

+0

Bu teklife bağlantı kurabilir misiniz? Daha önceki yorumumda – einpoklum

+0

Ping. – einpoklum

İlgili konular