当浏览operator new、operator new[] - cppreference.com时,我们似乎有很多选项来分配具有特定对齐要求的对象数组。但是,没有指定如何使用它们,而且我似乎找不到正确的 C++ 语法。
我可以以某种方式显式调用该运算符,还是编译器会自动推断重载?:
void* operator new[]( std::size_t count, std::align_val_t al );
Run Code Online (Sandbox Code Playgroud)
看看Bartek的编码博客,似乎编译器会根据对齐要求是否大于__STDCPP_DEFAULT_NEW_ALIGNMENT__(在64位机器上通常为16)自动选择重载。
在某些情况下是否可以手动为new操作员选择重载?有时我可能希望分配的块以某种方式对齐(我假设对齐始终是 2 的幂,并且可能大于 16)。
在可预见的将来,我可能会使用 GCC 和 C++ >= 17。
我希望能够测量 GPU 上运行整个图形管道所花费的时间(以毫秒为单位)。目标:能够在优化代码之前/之后保存基准(下一步将是 mipmap 纹理)以查看改进。这在 OpenGL 中非常简单,但我是 Vulkan 的新手,需要一些帮助。
我浏览了相关的现有答案(此处和此处),但它们并没有太大帮助。而且我在任何地方都找不到代码示例,所以我敢在这里提问。
通过文档页面,我发现了一些我认为应该使用的函数,因此我设置了如下所示的功能:
void CreateQueryPool()
{
VkQueryPoolCreateInfo createInfo{};
createInfo.sType = VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO;
createInfo.pNext = nullptr; // Optional
createInfo.flags = 0; // Reserved for future use, must be 0!
createInfo.queryType = VK_QUERY_TYPE_TIMESTAMP;
createInfo.queryCount = mCommandBuffers.size() * 2; // REVIEW
VkResult result = vkCreateQueryPool(mDevice, &createInfo, nullptr, &mTimeQueryPool);
if (result != VK_SUCCESS)
{
throw std::runtime_error("Failed to create time query pool!");
}
}
Run Code Online (Sandbox Code Playgroud)
我的想法是queryCount = mCommandBuffers.size() * 2在渲染之前和之后为单独的查询时间戳留出空间,但我不知道这个假设是否正确。
出于说明目的,我展示了两个小的、略有不同的模板化递归定义。一个使用 an enum,另一个使用static constexpr定义一个值。
我检查了两个程序的输出程序集,它们完全相同,并且在语义上它们看起来也相同。
我认为constexpr可能更现代一些,但是使用enum/之间有什么区别static constexpr,或者是否有任何特定用例的区别真的很重要?
// using enum
template<uint64_t N>
struct Sum {
enum : uint64_t { value = N + Sum<N - 1>::value };
};
template<>
struct Sum<0> {
enum : uint64_t { value = 1 };
};
Run Code Online (Sandbox Code Playgroud)
// using static constexpr
template<uint64_t N>
struct Sum {
static constexpr uint64_t value = N + Sum<N - 1>::value;
};
template<>
struct Sum<0> {
static constexpr uint64_t value = 1; …Run Code Online (Sandbox Code Playgroud) 是否可以向函数参数添加编译器级约束,它们必须尚未初始化,例如,以下情况可以正常:
void f(SomeClass& a) { /* ... */ }
int main() {
f(new SomeClass());
return 0;
}
Run Code Online (Sandbox Code Playgroud)
虽然以下内容不合适:(因为a已初始化并存储在变量中)
int main() {
SomeClass a;
f(a);
return 0;
}
Run Code Online (Sandbox Code Playgroud)