Vulkan-hpp正在reinterpret_casting非标准布局类到另一个类。这合法吗?

时间:2019-07-11 09:21:24

标签: c++ language-lawyer vulkan strict-aliasing

所以最近我一直在使用Vulkan-Hpp(Vulkan Api的官方c ++绑定,Github Link)。

查看源代码,我发现它们围绕本机Vulkan结构创建包装器类(例如,vk::InstanceCreateInfo围绕VkInstanceCreateInfo包裹)。 (注意:环绕,而不是来自

调用本地Vulkan API时,将指向包装类的指针reinterpret_cast编入本地Vulkan结构中。使用vk::InstanceCreateInfo的示例:

//definition of vk::InstanceCreateInfo
struct InstanceCreateInfo
{
    /*  member function omitted  */
private:
  StructureType sType = StructureType::eInstanceCreateInfo;
public:
  const void* pNext = nullptr;
  InstanceCreateFlags flags;
  const ApplicationInfo* pApplicationInfo;
  uint32_t enabledLayerCount;
  const char* const* ppEnabledLayerNames;
  uint32_t enabledExtensionCount;
  const char* const* ppEnabledExtensionNames;
};

//definition of VkInstanceCreateInfo
typedef struct VkInstanceCreateInfo {
    VkStructureType             sType;
    const void*                 pNext;
    VkInstanceCreateFlags       flags;
    const VkApplicationInfo*    pApplicationInfo;
    uint32_t                    enabledLayerCount;
    const char* const*          ppEnabledLayerNames;
    uint32_t                    enabledExtensionCount;
    const char* const*          ppEnabledExtensionNames;
} VkInstanceCreateInfo;

//And the usage where reinterpret_cast takes place
template<typename Dispatch>
VULKAN_HPP_INLINE ResultValueType<Instance>::type createInstance( const InstanceCreateInfo &createInfo, Optional<const AllocationCallbacks> allocator, Dispatch const &d )
{
  Instance instance;
  Result result = static_cast<Result>( d.vkCreateInstance( reinterpret_cast<const VkInstanceCreateInfo*>( &createInfo ), reinterpret_cast<const VkAllocationCallbacks*>( static_cast<const AllocationCallbacks*>( allocator ) ), reinterpret_cast<VkInstance*>( &instance ) ) );
  return createResultValue( result, instance, VULKAN_HPP_NAMESPACE_STRING"::createInstance" );
}

所以我的问题是:vk::InstanceCreateInfoVkInstanceCreateInfo是两种不同的类型。此外,VkInstanceCreateInfo是标准布局,而vk::InstanceCreateInfo不是标准布局(因为它具有混合的访问说明符)。 reinterpret_cast在这两种类型的指针之间(由Vulkan-Hpp完成)合法吗?这是否违反严格别名规则


注意:在这种情况下,您可以假设VkInstanceCreateFlagsvk::InstanceCreateFlags是可互换的(否则它将使我的问题递归)

1 个答案:

答案 0 :(得分:4)

就标准而言,是的,通过指向onStart(state)对象的指针访问required required="required" required="true" aria-required="true" <input name="Depot" id="Depot" type="text" class="form-control attach-validation" aria-required="true" required="required"/> 对象违反了严格的别名。即使两种类型都是具有等效布局的标准布局,它仍然会违反严格的别名。该标准不允许您假装一个类类型是另一种,即使它们具有相同的布局。

因此,此代码依赖于某些特定于实现的行为。

那是错的吗?即使没有Vulkan接口函数调用,它也会为每个Vulkan接口函数调用创建附加副本,让您对此感觉更好吗?最终取决于您的承受能力。