小编Val*_*ris的帖子

libc ++中短字符串优化的机制是什么?

这个答案给出了短字符串优化(SSO)的一个很好的高级概述.但是,我想更详细地了解它在实践中是如何工作的,特别是在libc ++实现中:

  • 为了符合SSO资格,字符串有多短?这取决于目标架构吗?

  • 在访问字符串数据时,实现如何区分短字符串和长字符串?它m_size <= 16是一个简单的,还是一个标志,是其他成员变量的一部分?(我想这m_size或其中的一部分也可能用于存储字符串数据).

我专门针对libc ++问了这个问题,因为我知道它使用SSO,甚至在libc ++主页上也提到过.

以下是查看来源后的一些观察结果:

libc ++可以使用两个稍微不同的字符串类内存布局进行编译,这由_LIBCPP_ALTERNATE_STRING_LAYOUT标志控制.这两种布局还区分了little-endian和big-endian机器,这使我们总共有4种不同的变体.我将在下面的内容中假设"正常"布局和小端.

假设进一步size_type是4个字节并且value_type是1个字节,这就是字符串的前4个字节在内存中的样子:

// short string: (s)ize and 3 bytes of char (d)ata
sssssss0;dddddddd;dddddddd;dddddddd
       ^- is_long = 0

// long string: (c)apacity
ccccccc1;cccccccc;cccccccc;cccccccc
       ^- is_long = 1
Run Code Online (Sandbox Code Playgroud)

由于短字符串的大小在高7位,因此在访问它时需要移位:

size_type __get_short_size() const {
    return __r_.first().__s.__size_ >> 1;
}
Run Code Online (Sandbox Code Playgroud)

类似地,长字符串容量的getter和setter用于__long_mask解决这个问题is_long.

我仍在寻找我的第一个问题的答案,即__min_cap短字符串的容量对不同的架构有什么价值?

其他标准库实现

这个答案很好地概述了std::string其他标准库实现中的内存布局.

c++ string optimization c++-standard-library libc++

93
推荐指数
2
解决办法
3万
查看次数

使用宏检测gcc而不是msvc/clang

我正在开发一个迄今为止用gcc和msvc构建的项目.我们最近也开始用clang构建.

代码中有一些部分,其中特定于平台的事情已经完成:

#ifndef _WIN32
// ignore this in msvc
#endif
Run Code Online (Sandbox Code Playgroud)

由于gcc以前是唯一的非windows构建,这相当于说"只为gcc做这个".但现在它意味着"只为gcc和clang做这个".

然而,仍然有一些情况,我想专门为gcc处理一些东西,而不是为了clang.是否有一种简单而强大的方法来检测gcc,即

#ifdef ???
// do this *only* for gcc
#endif
Run Code Online (Sandbox Code Playgroud)

c++ gcc

43
推荐指数
3
解决办法
2万
查看次数

零初始化初始化列表中的数组成员

我有一个数组成员的类,我想初始化为全零.

class X
{
private:
    int m_array[10];
};
Run Code Online (Sandbox Code Playgroud)

对于局部变量,有一种简单的零初始化方法(参见此处):

int myArray[10] = {};
Run Code Online (Sandbox Code Playgroud)

此外,类成员m_array显然需要初始化,因为默认初始化整数会见好就收随机的垃圾,如解释在这里.

但是,我可以看到两种方法为成员数组执行此操作:

括号:

public:
    X()
    : m_array()
    {}
Run Code Online (Sandbox Code Playgroud)

带括号:

public:
    X()
    : m_array{}
    {}
Run Code Online (Sandbox Code Playgroud)

两个都正确吗?这两者在C++ 11中有什么区别吗?

c++ initialization array-initialization initialization-list

25
推荐指数
2
解决办法
1万
查看次数

在HTML中嵌入csv以与D3.js一起使用

在D3.js中,通常从外部csv文件加载数据.这对于大数据非常有效,并且避免在数据更改时更改代码.

但是,有两种情况(仅使用小型csv数据)我想直接在HTML页面中嵌入csv:

  • 可以在本地加载的页面(即来自file:///),无需运行本地HTTP服务器.
  • 一个小的jsfiddle示例,解释了在stackoverflow上使用的D3.js问题.

csv dom d3.js

12
推荐指数
1
解决办法
6526
查看次数

EcmaScript-6向后兼容

我很想知道/弄清楚ECMAScript-6的新变化是否适用于旧的浏览器.

我为什么问这个问题是:

我记得'use strict';在ECMAScript-5中的介绍,它是为了与旧版本的兼容性.

这意味着旧的浏览器将继续正常工作,并且'use strict';在解析新的JavaScript代码时遇到语句时会忽略它.

并且新的JS引擎将以'use strict';某种特殊的方式处理语句,详见此严格模式.


所以,提出问题

我非常怀疑并且好奇地知道ECMAScript-5兼容的浏览器在解析ECMAScript-6代码时会如何表现.

我怀疑的原因是ECMAScript-6新功能涉及语法更改/更新.旧的浏览器是新语法 - 不知道的引擎,当它们遇到以下任何新语法时会开始抛出错误

yield[*], Map, Set, WeakMap, function* foo(){}, =>, for...of etc.

我担心的是ECMAScript-6中的新功能的决定/包含在没有任何代码中断的情况下支持旧浏览器吗?

如果是,那怎么样?

如果不是那么我该怎么做才能让我的旧浏览器用户满意?

我看到一个解决方案,以保持使用包括一些快乐的旧的浏览器的用户transpilertraceur编译在我的项目.这会将我的ECMAScript-6代码转换为ECMAScript-5等效代码.但是,我还有其他任何解决方案可以让我的旧浏览器用户满意吗?

javascript backwards-compatibility ecmascript-5 ecmascript-6

11
推荐指数
2
解决办法
8505
查看次数

打字稿转换es6 .js依赖于es5

我的项目中有一个假设的Typescript文件(简化示例).

Utils.ts:

import * as HelperFromNodeModules from 'helper-from-node-modules';

class Utils {
  static foo() {
    return HelperFromNodeModules.parse(...);
  }
}
Run Code Online (Sandbox Code Playgroud)

导入helper-from-node-modules包含一个Javascript文件.

helper-from-node-modules.js:

const dep = require('foo');
function parse(...) {
   return bar.map((e) => {...});
}
Run Code Online (Sandbox Code Playgroud)

@types/helper-from-node-modules index.d.ts:

export function parse(...);
Run Code Online (Sandbox Code Playgroud)

tsconfig.json除其他外包含以下内容:

{
  ...
  "target": "es5",
  "lib": ["es2015.collection","es6", "dom"],
  "sourceMap": true,
  "allowJs": true,
  ...
}
Run Code Online (Sandbox Code Playgroud)

所以我的问题是Typescript编译器的输出文件是我编译的源代码加上所有的重要性的巨大连接.由于helper-from-node-modules始终是.js文件,编译器似乎只是将其内容附加到输出文件.所以,尽管"target": "es5"输出文件中仍含有ES6工件,如const(e) => {...},导致在后来的事情是希望严格错误ES5的JavaScript.

有没有办法告诉Typescript编译器/转换器在javascript依赖上输出 …

javascript typescript ecmascript-6 tsconfig react-create-app

11
推荐指数
2
解决办法
2372
查看次数

使用ccache/clang编译Qt代码时,请避免多余的警告

我和这个家伙有同样的问题.使用clang和ccache进行编译每次遇到Q_OBJECT时都会收到此警告:

warning: explicitly assigning value of variable of type 'int' to itself [-Wself-assign]
Run Code Online (Sandbox Code Playgroud)

这只发生在使用ccache时,单独使用clang编译相同的代码工作正常.

宏扩展似乎存在类似的问题,其中建议的解决方案是设置环境变量

CCACHE_CPP2=yes
Run Code Online (Sandbox Code Playgroud)

不幸的是,这似乎并没有解决我的问题,或者说我做错了.

我试过了:

  • 从命令行构建

    • CCACHE_CPP2=yes ninja

    • export CCACHE_CPP2=yes ninja

  • 从Qt Creator CCACHE_CPP2构建,添加到"构建环境"

我还能做些什么来解决这个宏扩展问题吗?我特别不希望全局禁用警告(因为这很糟糕)或本地(因为这意味着将所有宏包装在特定于编译器的样板文件中).

c++ qt clang ccache

8
推荐指数
1
解决办法
1139
查看次数

用于转换为并行集合的通用类型参数

我有这个函数转换Array为a ParArray,给出线程数作为参数:

def parN[T](collection: Array[T], n: Int) = {
    val parCollection = collection.par
    parCollection.tasksupport = new ForkJoinTaskSupport(
      new concurrent.forkjoin.ForkJoinPool(n))
    parCollection
}
Run Code Online (Sandbox Code Playgroud)

现在我想使这个通用,这样它适用于除Array以下之外的集合:

def parN[S, T[S] <: Parallelizable[S, ParIterable[S]]](collection: T[S], n: Int) = {
    val parCollection = collection.par
    parCollection.tasksupport = new ForkJoinTaskSupport(
      new concurrent.forkjoin.ForkJoinPool(n))
    parCollection
}
Run Code Online (Sandbox Code Playgroud)

但是当我调用它parN(Array(1, 2, 3), 2),我收到此错误:

inferred type arguments [Int,Array] do not
conform to method parN's type parameter bounds
[S,T[S] <: scala.collection.Parallelizable[S,scala.collection.parallel.ParIterable[S]]]
Run Code Online (Sandbox Code Playgroud)

另一方面,这是有效的:

val x: Parallelizable[Int, …
Run Code Online (Sandbox Code Playgroud)

generics types scala type-inference scala-collections

7
推荐指数
1
解决办法
298
查看次数

在libarchive中设置UTF-8路径名头

摘要

如何在C++中使用libarchive编写zip文件,以便路径名是UTF-8编码的?使用UTF-8路径名时,使用OS X/Linux/Windows 8/7-Zip/WinZip时,将正确解码特殊字符.

细节

我正在尝试使用libarchive编写zip存档,在Windows上使用Visual C++ 2013进行编译.

我希望能够将带有非ASCII字符的文件(例如äöü.txt)添加到zip存档中.

在libarchive中有四个函数来设置pathname标头:

void archive_entry_set_pathname(struct archive_entry *, const char *);
void archive_entry_copy_pathname(struct archive_entry *, const char *);
void archive_entry_copy_pathname_w(struct archive_entry *, const wchar_t *);
int  archive_entry_update_pathname_utf8(struct archive_entry *, const char *);
Run Code Online (Sandbox Code Playgroud)

不幸的是,它们似乎都没有用.

特别是,我试过:

const char* myUtf8Str = ...
archive_entry_update_pathname_utf8(entry, myUtf8Str);
// this sounded like the most straightforward solution
Run Code Online (Sandbox Code Playgroud)

const wchar_t* myUtf16Str = ...
archive_entry_copy_pathname_w(entry, myUtf16Str);
// UTF-16 encoded strings seem to be the default on Windows
Run Code Online (Sandbox Code Playgroud)

在这两种情况下,生成的zip存档都不会在Windows资源管理器和7-Zip中正确显示文件名.

我确信我的输入字符串编码正确,因为我从Qt QString实例转换它们在我的代码的其他部分非常有效:

const char* …
Run Code Online (Sandbox Code Playgroud)

c++ zip utf-8 wstring libarchive

7
推荐指数
1
解决办法
1106
查看次数

将回调添加到在web.list.Column的子类中创建的DOM元素

我正在尝试修改web_tree_image小部件.我希望在悬停或点击时显示更大的图像,而不是仅在列中显示小图像.为了实现这一点,我试图通过覆盖start函数来渲染窗口小部件后添加回调,如文档所述.

因此,我将以下代码添加到web_tree_image.js:

openerp.web_tree_image = function (instance) {
    instance.web.list.Image = instance.web.list.Column.extend({
        // [...]
        start: function() {
            console.log("start called");
            // [... add callbacks ...]
        },
        // [...]
    });
};
Run Code Online (Sandbox Code Playgroud)

但是,start从不调用该函数,因此这不起作用.

我还没有完全理解通常会start被调用的代码路径,但似乎它在某种程度上是不同的web.list.Column.

应该start打电话给我,我做错了什么?或者在创建DOM元素之后还有另一种执行代码的方法吗?

javascript callback openerp openerp-8 odoo-8

7
推荐指数
1
解决办法
480
查看次数

Chrome为自定义HTML元素的offsetWidth返回0

在尝试创建一个Angular指令,使其内容的大小适应容器的大小时,我偶然发现了以下问题:

最小的HTML代码段:

<my-tag id="testWidth">
  <div>some text</div>
</my-tag>
Run Code Online (Sandbox Code Playgroud)

当读取宽度时my-tag,我得到0Chrome 的结果,而Firefox返回正确的结果.在Chrome中,如果我替换,结果也是正确my-tagdiv.

这是我用来获取宽度的表达式:

document.getElementById('testWidth').offsetWidth
Run Code Online (Sandbox Code Playgroud)

据我所知,my-tag应该是一个有效的自定义元素名称.还有什么我做错了,或者这只是Chrome中的一个错误?

Chrome版本:49.0.2623.112米

jsfiddle快速测试

我试图了解Chrome的行为是否正确或是否是错误.

MDN文档说:

HTMLElement.offsetWidth只读属性返回元素的布局宽度.

据我所知,它并没有说这仅适用于具有块显示的元素.我还通过Firefox返回我期望的事实来支持我的理解.

对于span标签也可以观察到相同的行为差异,请看这个小提琴.

javascript html5 dom

6
推荐指数
1
解决办法
7792
查看次数

使用带有Boost测试的枚举类

我有一个我想在单元测试中使用的枚举类:

enum class MyEnumClass
{
    MyEntryA,
    MyEntryB
};
Run Code Online (Sandbox Code Playgroud)

我想用它如下:

MyEnumClass myEnumValue = MyEnumClass::MyEntryA;
BOOST_CHECK_EQUAL(myEnumValue, MyEnumClass::MyEntryB);
Run Code Online (Sandbox Code Playgroud)

但是我得到了这个错误,显然因为boost测试试图输出值:

include/boost/test/test_tools.hpp:326:14: error: cannot bind 'std::ostream {aka std::basic_ostream<char>}' lvalue to 'std::basic_ostream<char>&&'
         ostr << t; // by default print the value
              ^
Run Code Online (Sandbox Code Playgroud)

添加丑陋的static_cast"解决"问题:

BOOST_CHECK_EQUAL(static_cast<int>(myEnumValue), static_cast<int>(MyEnumClass::MyEntryB));
Run Code Online (Sandbox Code Playgroud)

但是我想避免为每个枚举类做到这一点.我还想避免<<为每个枚举类定义流操作符.

是否有更简单的方法来使用带有boost测试的枚举类?

或者其他单元测试框架是否有更好的方法来处理枚举类?

c++ boost-test enum-class

5
推荐指数
2
解决办法
1230
查看次数

访问父组件中的子数据

如何访问父组件中的数据?

这是组件:

<script>
  import Search from './components/Search.svelte'
</script>

<Search />
Run Code Online (Sandbox Code Playgroud)

这是组件:

<script>
  export let term
</script>

<input bind:value={term} />
Run Code Online (Sandbox Code Playgroud)

谢谢!

svelte

2
推荐指数
1
解决办法
847
查看次数