将对象的返回值存储在引用中是否有效?
class A { ... };
A myFunction()
{
A myObject;
return myObject;
} //myObject goes out of scope here
void mySecondFunction()
{
A& mySecondObject = myFunction();
}
Run Code Online (Sandbox Code Playgroud)
是否可以这样做以避免将myObject复制到mySecondObject?不再需要myObject,它应该与mySecondObject完全相同,所以理论上将对象的所有权从一个对象传递到另一个对象会更快.(这也可以使用boost共享指针,但是它具有共享指针的开销.)
提前致谢.
我有一个std::vector<std::uint8_t>,需要重复.只需调用复制构造函数即可完成此操作.
我的分析结果显示,Microsoft Visual C++(msvc100)实现在std::uninitialized_copy内部使用.这将逐个复制每个元素.在这种情况下,可以通过一次复制整个存储块来完成更优化的复制(就像memcpy可能一样).
换句话说,这可能是一个重要的优化.有没有办法强制矢量使用这种优化方法?
注意:我尝试过使用std::basic_string<std::uint8_t>它确实表现更好,但它有其他问题.
我试图无损压缩图像,为了利用规律性,我想将图像从RGB转换为Y'CbCr.(我和RGB和Y'CbCr的含义的确切细节在这里并不重要; RGB数据由三个字节组成,我有三个字节来存储结果.)
转换过程本身非常简单,但有一个问题:尽管转换在数学上是可逆的,但实际上会出现舍入误差.当然,这些错误很小,几乎无法察觉,但它确实意味着该过程不再是无损的.
我的问题是:是否存在转换,将三个八位整数(表示红色,绿色和蓝色分量)转换为另外三个八位整数(表示类似于Y'CbCr的颜色空间,其中两个组件仅稍微改变相对于位置,或至少小于RGB颜色空间),并且可以在不丢失信息的情况下进行反转?
我有点困惑要使用哪个Haskell Html库。人们倾向于推荐使用Haskell平台中可用的库(就是这种情况Text.Html),但是似乎每个人都在使用Blaze.Html。
两者有什么区别?
当我removeDirectoryRecursive在 Windows 上使用时,IOException类型PermissionDenied,并显示消息 \xe2\x80\x9cremoveDirectoryRecursive:权限被拒绝\xe2\x80\x9d。我确实拥有删除该目录所需的权限。对于具有相同内容的目录,在 Linux 上不会出现此问题。
场景如下:应该临时存储一个加密密钥,以便应用程序的多个实例可以(顺序)访问它。使用后,当然应该从系统中删除密钥。然而,这带来了一个问题。我承认只要存储了密钥,系统就容易受到攻击,但我希望系统在存储密钥之前和之后都是安全的。
简单地将密钥写入文件并在之后覆盖它在所有情况下都不起作用:某些文件系统将更改写入磁盘的不同部分,而不是同一位置。在这种情况下,之后仍然可以检索密钥。我不能依赖具有全盘加密的用户。
那么最合乎逻辑的选择似乎是使用另一个将密钥保存在内存中的进程,但是操作系统可能会在某些点将内存写入磁盘,从而导致与上述相同的问题。
可以加密密钥,但这并不安全。临时存储密钥的全部意义在于,用户无需在每次运行程序时都输入它。这意味着用于加密密钥的密钥也必须存储在某处,或者必须基于已知数据。如果存储了密钥,那么当然我们现在有安全存储此密钥的问题。如果是基于已知数据,则意味着可以在必要时再次生成密钥,因此加密几乎没有用。
我知道有些操作系统提供 API 来保护数据,但这通常依赖于根据用户帐户信息生成加密密钥。即使这是特定于会话的,在会话结束之前数据也不会是安全的(这可能是在密钥应该被擦除之后很久)。
这个问题有什么解决办法吗(不依赖特殊硬件,不需要全盘加密等)?如果没有,在这种情况下我能做的最好的事情是什么?
编辑澄清:当密钥存储在内存中时,它不需要是安全的;此时,用户应保证无法进行物理访问,并且系统没有病毒。使用密钥后,应将其从系统中删除,以便之后具有物理访问权限的任何人或任何程序都可以检查所有内存和磁盘,而不再找到密钥的单个(可用)痕迹。
假设我有这个结构:
struct vector_data
{
double x, y;
double& operator[](size_t index)
{
return * (static_cast<double*>(static_cast<void*>(this)) + index);
}
};
Run Code Online (Sandbox Code Playgroud)
operator []应该按预期工作,因为vector_data是POD类型.预期的行为是vector_data [0]返回x,vector_data [1]返回y.
现在假设我有第二个结构:
struct more_data
{
double evil_data;
// There could be more here, data or functions
};
Run Code Online (Sandbox Code Playgroud)
并且来自这两个:
struct composed : public more_data, public vector_data
{
};
Run Code Online (Sandbox Code Playgroud)
请问这个destory运算符[]的预期行为?换句话说,派生结构中的vector_data的this-pointer是否仍然指向struct的vector_data部分,还是指向派生结构的开头?
如果它确实破坏了operator [],那么我该如何解决这个问题呢?我可以先从vector_data继承,但假设compos包含虚函数.我知道大多数编译器都将vtable放在最后,但这并不能保证.什么是最好的方法?
这似乎是一个愚蠢的问题,但我找不到答案......
这是维基百科的XXTEA代码:
#include <stdint.h>
#define DELTA 0x9e3779b9
#define MX ((z>>5^y<<2) + (y>>3^z<<4)) ^ ((sum^y) + (k[(p&3)^e] ^ z));
void btea(uint32_t *v, int n, uint32_t const k[4]) {
uint32_t y, z, sum;
unsigned p, rounds, e;
if (n > 1) { /* Coding Part */
rounds = 6 + 52/n;
sum = 0;
z = v[n-1];
do {
sum += DELTA;
e = (sum >> 2) & 3;
for (p=0; p<n-1; p++)
y = v[p+1], z = v[p] += MX;
y …Run Code Online (Sandbox Code Playgroud) 我有一个LINQ查询,它在多个字段中搜索字符串(使用正则表达式).我想根据找到文本的字段对结果进行排序.
目前我有这个:
var results = from i in passwordData.Tables["PasswordValue"].AsEnumerable()
where r.IsMatch(i.Field<String>("Key").Replace(" ","")) ||
r.IsMatch(i.Field<String>("Username").Replace(" ","")) ||
r.IsMatch(i.Field<String>("Other").Replace(" ",""))
orderby i.Field<String>("Key"),
i.Field<String>("Other"),
i.Field<String>("Username")
select i;
Run Code Online (Sandbox Code Playgroud)
我希望在Key中找到匹配项,然后在Other中找到匹配项,然后在Username中找到匹配项.如果可能,匹配Key和Other的匹配应该在匹配Key之前匹配.
我现在的代码基于Key排序,所以如果在Other上找到匹配但是Key以A开头,它将在Key上找到匹配之前排序,其中Key以Z开头.
提前谢谢,我认为这不是一个难题,但我不知道如何做到这一点,因为我是LINQ的新手.
c++ ×4
c# ×2
cryptography ×2
haskell ×2
blaze-html ×1
color-space ×1
linq ×1
memcpy ×1
optimization ×1
performance ×1
pod ×1
reference ×1
return-value ×1
rgb ×1
security ×1
sorting ×1
stdvector ×1
this ×1
windows ×1