我有一个C++类,我只希望它在堆栈上实例化.我正在使用api访问以另一种(解释)语言开发的内容,该语言带有自己的垃圾收集.这种语言中的机制足以将它在堆栈中找到引用的任何内容留下来,并且由于这个本机类包含这样的引用,因此对于正确的行为来说,它本身就是C++类的用户是至关重要的.永远不要尝试在其他任何地方分配它的实例.
注意,我不仅要禁止我的类的实例被分配new(如果这是我需要做的全部,我可以重载类的new运算符并将其设为私有,或者从C++ 11开始明确删除它),但也要禁止该类的任何静态或可能的全局实例.安全地实例化这个类的唯一有效方法应该在堆栈上,我想以某种方式保证.据我所知,new私有或删除它也不会阻止另一个类被我的类声明为成员变量和在堆上分配的实例.
我现在如何处理这个问题就是将"Local"作为类名称的一部分,作为对用户的友好提醒,该实例仅用于堆栈,但当然,这不是'实际上是由编译器或任何其他机制强制执行的,我更喜欢一种更具可执行性的解决方案.
理想情况下,我想在编译时确保这一点,如果使用不正确则编译失败.如果这根本不可能,那么在构造实例时在运行时抛出异常仍然是可接受的回退.在C++ 11或C++ 14中工作的解决方案很好.
请注意,这个问题肯定是不一样的这一个,它只是想防止allocaton与new
我有一个字符串,应该用ISO 8601格式指定一个日期和时间,其中可能有或没有毫秒,我想struct tm从它获得一个以及可能已指定的任何毫秒值(可以是如果不存在于字符串中则假定为零).
检测字符串格式是否正确,以及将用户指定的字符串转换为struct tm毫秒和毫秒值会涉及什么?
如果它不是毫秒问题,我可能只是使用C函数strptime(),但我不知道当秒包含小数点时该函数的定义行为应该是什么.
最后一点需要注意的是,如果可能的话,我会更喜欢一种解决方案,它不依赖于仅在Boost中找到的函数(但我很乐意接受C++ 11作为先决条件).
输入看起来像:
2014-11-12T19:12:14.505Z
Run Code Online (Sandbox Code Playgroud)
要么
2014-11-12T12:12:14.505-5:00
Run Code Online (Sandbox Code Playgroud)
Z在这种情况下,表示UTC,但可以使用任何时区,并将表示为与GMT的+或 - 小时/分钟偏移.秒字段的小数部分是可选的,但它可能存在的事实是我不能简单地使用strptime()或者std::get_time(),如果在字符串的秒部分中找到这样的字符,则不会描述任何特定的定义行为.
我正在研究一个6502 cpu的汇编语言程序,我发现我需要一个快速尽可能快的七分程序,特别是一个可以获得16位分红的程序.
我熟悉这里发现的例程,但是对七分法例程进行了概括,发现它非常复杂,粗略地检查了一般算法(使用整数除法)
x/7~ =(x + x/8 + x/64 ...)/ 8
表示要处理16位范围,由于6502的单个累加器寄存器和6502上各个存储器位移的相对慢速,可能需要100多个周期才能完成.
我认为查找表可能会有所帮助,但在6502上,我当然只限于256字节或更少的查找表.为此,可以假设存在两个256字节的查找表xdiv7和xmod7,当使用无符号的单字节值作为表的索引时,可以快速获得字节除以7或模数的结果分别为7.但是,我不确定如何利用它们来查找完整16位范围的值.
与此同时,我还需要一个模7算法,尽管理想情况下,可以通过除法得到的解决方案也会产生mod7结果.如果需要额外的预计算表,只要所有表的总内存需求不超过约3k,我就可以添加这些表.
虽然我最终需要一个带符号的除法算法,但是一个无符号算法就足够了,因为我可以根据需要将它推广到一个有符号的例程.
任何帮助将不胜感激.
我经常用OpenGL找到,当我试图在纹理上绘制一些东西然后再到另一个表面上时,使用glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA),我总是最终得到一个彩色光环(通常是一个深色的带),在我的源的半透明部分边缘附近的图像.这显然是由于制作本质上是由该混合风格引起的预乘alpha的问题引起的.对于3D场景,我通常使用画家算法,并且为了渲染2D内容,我喜欢先绘制最后面的对象,然后在它们之上覆盖其他对象.值得注意的是,在进行这样的2D绘制时,我通常不能像3d中那样依赖像az缓冲区这样的功能,这就是为什么渲染像guis这样的东西比3D场景图更多的问题.
我认为值得注意的是,当目标缓冲区恰好已完全不透明时,上述混合风格实际上是完美的,但如果目标是透明的,那么在这种情况下实际需要的是glBlendFunc(GL_SRC,GL_ZERO)......因为任何全白像素例如,在源中部分透明,应该保持完全饱和的颜色,而不是与实际上不存在的背景"混合",因为使用glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA)实际上会渲染部分透明和全白像素前景和背景之间的混合,这是我想要的,但不是alpha信息丢失的程度,也不是实际改变颜色的程度.
因此,在我看来,那种可能完美的混合函数实际上会混合在原本由其自身价值引起的glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA)和由此引起的内容之间.glBlendFunc(GL_SRC,GL_ZERO)DST_ALPHA
因此,理想情况下:
Cr = Cs * (1 - Ad) + (Cs * As + Cd * (1 - As)) * Ad
Ar = As * (1 - Ad) + Ad * Ad
Run Code Online (Sandbox Code Playgroud)
这样,如果目的地已经是不透明的,则正常的阿尔法乘法适当地混合,而如果目的地是透明的或部分透明的,它将使用更多的源图像的真实颜色而不是使用所述颜色的阿尔法预乘形式.
然而,似乎没有明显的方法来描述这种混合机制到OpenGL.似乎这些问题在我的情况下几乎不应该是独一无二的,而且对我来说似乎并不常见,即使在可编程管道中也没有任何方法可以实现这一点.
到目前为止,我发现的唯一解决方法是每当我绘制一个纹理时反转绘图顺序,我将在其他地方绘制并使用glBlendFuncSeparate(GL_ONE_MINUS_DST_ALPHA, GL_DST_ALPHA, GL_SRC_ALPHA, GL_DST_ALPHA).
在我将在以后正常渲染的纹理上绘制某些东西的情况下绘制顺序的特殊情况是一种妥协,但这对我来说没有吸引力,因为它缺乏可重用性,除非执行绘图的代码总是让人知道什么类型的目的地,以便它可以扭转自己通常的绘图顺序,我可以毫不必要地使它复杂化.
最后,尽管反转整个场景的绘制顺序并不一定完全不可能,但它要求在绘制第一个对象之前确定将在每个图形帧中显示的完整对象列表.我对此有一个核心问题是虽然在渲染3D场景时这可能是可持续的,但在绘制像2d gui这样的东西时,绘制的各种各样的东西以及绘制它们的方式都是如此之大以至于没有将它们概括为单个对象列表的方法,该列表总是可以在以后以相反的顺序遍历.在我看来,它需要这样一个根本不同的观点,如何按照我习以为常的"倒退"顺序构建2D场景,我现在根本无法理解可维护的解决方案.
那么......有另一种方法吗?我错过了什么吗?或者我是否必须学习一种完全不同的方式来构建2D图像?我不可能是唯一有这个问题的人,但我还没有找到任何好的和干净的解决方案.
编辑:
如果确实存在OpenGL的任何常用扩展,通过NVIDIA或其他方式,允许混合模式可以执行此操作:
Cr = Cs * (1 - Ad) + (Cs * As + Cd * (1 - As)) * Ad …Run Code Online (Sandbox Code Playgroud) 我想设置一个函数(或lambda函数)的调用,以便在当前线程退出时自动发生,但std::thread除非我接管线程创建的整个任务或手动确保,否则我看不到任何可行的方法.每个线程调用一些我总是提供的特定函数作为它的最后一个操作.
基本上,我想要的功能,其原型可能类似于这样的东西:
on_thread_exit(const std::function<void()> &func);
Run Code Online (Sandbox Code Playgroud)
当调用on_thread_exit的线程最终终止时,将执行必要的设置以确保自动调用给定函数,并且不需要在创建线程或终止时显式调用任何特定函数.
使用 Google 的 v8 c++ 库,我想创建一个上下文,其中定义了多个模板、变量和全局变量,并准备好供代码中的多个地方使用,这些地方可能运行在不同的线程上,每个地方都有自己的隔离,它们也应该在这里每个线程都有自己的本地上下文副本,因此对一个线程中全局变量的任何更改都不会影响其他线程。
每次我想要一个新的上下文时,我都可以通过显式设置我的所有模板、变量和全局变量来做到这一点,但我想知道是否有更有效的方法。假设我已经有一个代表主状态的全局 v8::Isolate 指针和 v8::Persistent。如果我想在自己的线程中创建一个全新的隔离,并创建一个本质上是 master 克隆的新上下文,那么我需要做什么?我知道我可以在对 master 的访问周围包装一个互斥锁,以确保不同的线程在必要时不会同时访问它。我只是不知道如何有效地将在一个隔离中创建的信息复制到另一个隔离中,而无需从头开始重新创建其全部内容。
我有一个包含n个元素的外部集合,我想随机选择它们中的一些数字(k),将这些元素的索引输出到某个序列化数据文件.我希望索引以严格的升序输出,并且没有重复.n和k都可能非常大,并且将整个数组简单地存储在该大小的存储器中通常是不可行的.
我想出的第一个算法是从1到nk中选择一个随机数r [0] ...然后从r [i-1] +1到n-k + i中选择一个连续的随机数r [i] ,只需要在任何时候为'r'存储两个条目.然而,一个相当简单的分析表明,选择小数的概率与整个集合均匀分布时的概率不一致.例如,如果n是十亿而k是五亿,那么用我刚刚描述的方法选择第一个条目的概率非常小(五分之一十亿),实际上,因为一半条目是被选中,第一个应该在50%的时间被选中.即使我使用外部排序来对k个随机数进行排序,我也不得不丢弃任何重复项,然后再试一次.当k接近n时,重试次数将继续增加,不保证终止.
如果可能的话,我想找到一个O(k)或O(k log k)算法来做这个.我将使用的实现语言是C++ 11,但伪代码中的描述可能仍然有用.
我正在尝试初始化一个多维数组,虽然可以在启动时填充该数组一次,但我真的更喜欢该数组constexpr,所以我想知道是否有一种方法可以让编译器为我执行此操作,特别是因为我可以提供一个 constexpr 函数,该函数接受每个索引的参数并返回数组应位于索引处的值。
例如:
constexpr bool test_values[64][64][64][64] = {
... // magic goes here
};
Run Code Online (Sandbox Code Playgroud)
我有一个函数constexpr bool f(int,int,int,int)可以告诉我每个元素应该是什么。我更喜欢通过数组访问条目,因为进行数组查找比调用 f() 获取非常量值更快。
我发现的大多数与在运行时初始化数组相关的其他问题都使用 std::array 而不是 C 数组,而且我找不到的问题都是多维的。我曾尝试将多维数组展开为一维数组,并使用 std::array 方法,例如我在这个问题的答案之一中找到的方法,但我发现 gcc 9.1 生成的结果代码仍然填充了数组在启动时一次,而不是编译器直接生成数组。
我可以做些什么来让编译器填充这种数组,还是我必须保留test_values有效的非constexpr,并在运行时初始化一次?
编辑:
澄清一下,我本质上并不反对使用 std::array 而不是内置的 C 风格数组,但我不认为 std::arrays 对多维特别友好,并且使用一维数组会混淆我的内容程序需要做的事情(坦率地说,如果必须的话,我愿意将其实现为一维 std::array ,但是多维数组感觉比手动展开的同等大小的一维数组更容易混淆,这就是为什么我用多维 C 数组来描述它)。
一个利平科特函数是一个例外转换为可以从中不支持例外,如C.这些功能其它语言的回调可安全处理返回代码的功能,因为他们故意用throw不带参数,从而重新抛出最最近捕获的异常,不能在catch块的上下文之外调用。
我想知道现代 C++(c++17 或 c++20)是否有任何声明机制来专门识别此类函数,并确保仅从catch块的上下文(或从另一个这样的上下文)调用函数函数),如果从任何其他上下文调用它,则会生成编译时错误。
假设X和是适合这种用途的类型,那么在一个线程中的内存区域上Y使用作为一种类型并在另一个线程中的完全相同的内存上使用是否是UB?标准对此有什么规定吗?如果不正确,正确的解释是什么?std::start_lifetime_as<X>std::start_lifetime_as<Y>
c++ object-lifetime undefined-behavior language-lawyer c++23