首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

什么是字符串常量池_常量池中的字符串是对象吗

运行时常量池相对于Class文件常量池的另外一个重要特征是具备动态性,Java语言并不要求常量一定只有编译期才能产生,也就是并非预置入Class文件中常量池的内容才能进入方法区运行时常量池,运行期间也可能将新的常量放入池中...在工作中,String类是我们使用频率非常高的一种对象类型。JVM为了提升性能和减少内存开销,避免字符串的重复创建,其维护了一块特殊的内存空间:字符串常量池。字符串常量池由String类私有的维护。...常量池和字符串常量池的版本变化 在JDK1.7之前运行时常量池逻辑包含字符串常量池存放在方法区, 此时hotspot虚拟机对方法区的实现为永久代 在JDK1.7 字符串常量池、静态变量等被从方法区拿到了堆中...默认比较小 永久代垃圾回收频率低 字符串拼接操作 常量与常量的拼接结果在常量池,原理是编译器优化 常量池中不会存在相同内容的常量 只要其中一个是变量,结果就在堆中。...变量拼接的原理是StringBuilder(final不算变量),返回String对象 如果拼接的结果调用intern()方法,则注定将常量池中还没有的字符串对象放入池中,并返回此对象地址 所以建议多使用

48140

jvm常量池和字符串常量池_常量池中的字符串是对象吗

字符串常量池由来 在日常开发过程中,字符串的创建是比较频繁的,而字符串的分配和其他对象的分配是类似的,需要耗费大量的时间和空间,从而影响程序的运行性能,所以作为最基础最常用的引用数据类型,Java设计者在...方法区和Java堆一样(但是方法区是非堆),是各个线程共享的内存区域,是用于存储已经被JVM加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。   ...当然,对于JDK1.8时,HostSpot VM对JVM模型进行了改造,将元数据放到本地内存,将常量池和静态变量放到了Java堆里。...这样的效果就变成了:常量池和静态变量存储到了堆中,类的元数据及运行时常量池存储到元空间中。 为啥要把方法区从JVM内存(永久代)移到直接内存(元空间)?...对于jvm底层,String str = new String("123")创建对象流程是什么?

53120
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    java 常量池和运行时常量池_常量池中的字符串是对象吗

    在JDK6.0及之前版本,字符串常量池是放在Perm Gen区(也就是方法区)中; 在JDK7.0版本,字符串常量池被移到了堆中了。至于为什么移到堆内,大概是由于方法区的内存空间太小了。...在JDK6.0及之前版本中,String Pool里放的都是字符串常量; 在JDK7.0中,由于String#intern()发生了改变,因此String Pool中也可以存放放于堆内的字符串对象的引用...class文件;class文件中除了包含类的版本、字段、方法、接口等描述信息外,还有一项信息就是常量池(constant pool table),用于存放编译器生成的各种字面量(Literal)和符号引用...3.运行时常量池(Runtime Constant Pool): 运行时常量池存在于内存中,也就是class常量池被加载到内存之后的版本,不同之处是:它的字面量可以动态的添加(String#intern...在解析阶段,会把符号引用替换为直接引用,解析的过程会去查询字符串常量池,也就是我们上面所说的StringTable,以保证运行时常量池所引用的字符串与字符串常量池中是一致的。

    47330

    字符串常量池 运行时常量池_常量池中的字符串是对象吗

    它包括了关于类,方法,接口等中的常量,也包括字符串常量,如String s = “java”这种申明方式;当然也可扩充,执行器执行器产生的常量也会放入常量池,故认为常量池是JVM的一块特殊的内存空间。...所以最后s4的地址是一个String类的对象,而s3是字符串常量池当中的引用,最终结果为false。...类型的对象,然后引入了常量池中的”hello”,最后执行了Stirng的构造器。...在调用了intern方法后将”11″加入到常量池中,再此之前常量池是没有”11″的,该方法返回的结果是常量池中的引用 而s4直接就是字符串常量池中的引用 最后进行比较,s3是String类型对象引用,s4...请注意,此数字是根据广泛的应用计算得出的平均值。特定应用程序的堆减少量可能上下变化很大。 实现: 当垃圾收集器工作的时候,会访问堆上存活的对象。

    27120

    C++常见避坑指南

    (2)这里由于使用u8""构造了UTF8编码字符串,但是不能直接用来构造std::string,所以进行转了下utf8ToString; 全局静态对象 大家有没有在工程代码中发现有下面这种写法,将常量字符串声明为静态全局的...看起来style 2虽然需要写两行代码,但函数内部的成本却是确定的,只会取决于你当前的编译器,外部即使采用不同的编译器进行函数调用,也并不会有多余的时间开销和稳定性问题。...对于这样的一个函数: void processwidget(std::shared_ptrpw, int); 如果使用以下方式调用,会有什么问题吗?...如果初始化由构造函数执行,则必须将构造函数声明为constexpr. ● 当满足这两个条件时,可以声明引用constexpr:引用的对象由常量表达式初始化,并且在初始化期间调用的任何隐式转换也是常量表达式...同时,constexpr 还可以用于指定数组的大小、模板参数等场景,提供更灵活的编程方式。 对constexpr函数的理解: \1. constexpr函数可以用在要求编译器常量的语境中。

    55510

    constexpr和常量表达式

    constexpr类型的构造函数(除拷贝构造函数外),所有非静态的数据成员以及字面值类型的基类 或者一个字面值类型的数组 上面对于字面值类型的定义还牵涉到平凡类型(trivial type),在另一篇博文会讲到...一个constexpr指针的初始值必须是nullptr或者0,或者是存储于某个固定地址中的对象(如全局变量、静态变量等)。...从C++11开始,规定允许将变量声明为constexpr类型以便由编译器来验证变量的值是否是一个常量表达式。声明为constexpr的变量一定是一个常量,而且必须用常量表达式初始化。...()是一个constexpr函数时,才是常量表达式,否则语句错误 constexpr指针 需要注意的是,与const关键字不同,一个指针被定义为constexpr,关键字仅对指针有效,与指针所指的对象无关...p 指针p和q的类型相差甚远,p是一个指向常量的指针,而q是一个常量指针,其中的关键在于constexpr把它所定义的对象置为了顶层const。

    40610

    深入探讨 `constexpr` 和 `const` 的区别

    深入探讨 constexpr 和 const 的区别 在 C++ 编程中,constexpr 和 const 是两个常用的关键字,它们在定义常量和函数时有着不同的用途和行为。...编译器会尝试在编译期求值 constexpr 函数,以提高性能和安全性。 函数要求: constexpr 函数必须是纯函数,即没有副作用,且其返回值仅依赖于输入参数。...函数体必须是一个单一的返回语句,或者是一个常量表达式。 使用场景: 可以用于定义编译期常量。 可以在编译期进行复杂的计算。...简单常量: 对于简单的常量表达式,const 和 constexpr 可以互相替换,但 constexpr 提供了编译期计算的额外优势。...总结 const:主要用于修饰变量、指针、函数参数和成员函数,表示这些对象在运行时不可变。适用于运行时常量和不可变参数。 constexpr:主要用于修饰变量和函数,表示这些对象在编译期求值。

    49110

    C++中变量声明与定义的规则

    静态全局变量(C++废弃,用匿名命名空间替代) Tips:对于全局变量,不管是否被static修饰,它的存储区域都是在静态存储区,生存期为整个源程序。...,我们可以让编译器来验证变量的值是否是一个常量表达式。...Tips:尽管指针和引用都能被定义成constexpr,但它们的初始值却受到严格限制。一个constexpr指针的初始值必须是nullptr、0或者是存储于某个固定地址中的对象。...2. constexpr是对指针的限制 在constexpr声明中定义了一个指针,限定符constexpr仅对指针有效,与指针所指对象无关: const int *pi1 = nullptr;...// 底层const: pi1是指向整型常量的普通指针 constexpr int *pi2 = nullptr; // 顶层const: pi2是指向整型的常量指针 我们也可以让constexpr指针指向常量

    2.4K10

    C++之constexpr详解

    声明为constexpr的变量一定是一个const变量,而且必须用常量表达式初始化: constexpr int mf = 20; //20是常量表达式 constexpr int limit = mf...const int*p = nullptr; //p是一个指向整形常量的指针 constexpr int* q = nullptr; //q是一个指向整数的常量指针 p是一个指向常量的指针...,q是一个常量指针,其中的关键在于constexpr把它所定义的对象置为了顶层const。...//p = &j; //error return 0; } 结果如下: 使用GNU gcc编译器时,constexpr指针所指变量必须是全局变量或者static变量(既存储在静态数据区的变量...但还有一个小点就是存放在静态数据区的变量是由低地址向高地址存放的,但存放在栈区的变量却是由高地址向低地址存放的,存放在静态数据区的还有静态局部变量和静态全局变量。

    58920

    【C++终极篇】C++11:编程新纪元的神秘力量揭秘

    如: constexpr int aa = 1; int b=2; constexpr const int x=b;//修饰的表达是是变量赋值。报错 那什么是常量表达式呢?...返回值不是常量表达式 constexpr int N5 = fxx(10); // 报错 ,返回值是常量表达式,但函数体内运行时还执行了其他操作 } ⑤constexpr不能修饰⾃定义类型的对象,但是...对于参数列表内的肯定不用,全局和静态的也不用,只有我们用的 局外的才需要捕捉才能用。...,普通函数取不取地址都一样(包装函数指针);但是如果是类的静态成员函数或者类的普通成员函数(这些函数默认有个this指针,故我们要从包装的function参数中加上,当然也可以是引用也可以是指针或者左右值对类的引用...11.2bind: bind 是⼀个函数模板,它也是⼀个可调⽤对象的包装器,可以把他看做⼀个函数适配器,对接收 的fn可调⽤对象进⾏处理后返回⼀个可调⽤对象。

    2900

    C++の自动类型推导和其他

    也就是说如果一个变量的类型是auto时,它会根据变量的值自动推导出类型。那么,可能就会有朋友产生疑问了:变量是什么类型不是很容易看出来吗?感觉没什么用处。...对于 int &k = j; 来说,其含义是将k绑定到j, 虽然k和j名字不同,但是在硬件上,它们占用同一块内存,既然j是常量,那么k必然是常量,而 int k = j; 就不一样了,他们占用不同的内存...constexpr作为限定词在含义上与const并不相同,constexpr是为了在初始化一个变量时,让编译器判断这个变量的值是否是一个常量或常量表达式,如果该变量用constexpr限定,但是初始化值并不是一个常量或者常量表达式...,编译器便会报错,(因为我们在定义常量时并不确定右边的表达式是否是常量表达式),这样看来还是难于解释,下面就用几个例子解释一下: constexpr int a = k +1; constexpr int...constexpr限定,编译器并不会检查newfunc() 前面我们说了指针和引用,这里constexpr也是可以和它们一起使用的,但是限制地比较严格。

    66410

    现代C++之constexpr

    (2)C++14中只要保证返回值和参数是字面值就行了,函数体中可以加入更多的语句,方便了更灵活的计算。 它的字面意思是 constant expression,常量表达式。...2.函数 const和constexpr也可以应用于函数。const函数必须是成员函数(方法,运算符),其中const关键字的应用意味着该方法无法更改其成员(非静态)字段的值。例如。...是对象或函数接口的一部分。...对于类的静态数据成员,const 缺省是不内联的,而 constexpr 缺省就是内联的。...前者可行的原因是,类的静态 constexpr 成员变量默认就是内联的。const 常量和类外面的 constexpr 变量不默认内联,需要手工加 inline 关键字才会变成内联。

    1.2K20

    技术◈C++核心知识总结(I)

    也就是说如果一个变量的类型是auto时,它会根据变量的值自动推导出类型。那么,可能就会有朋友产生疑问了:变量是什么类型不是很容易看出来吗?感觉没什么用处。...对于 int &k = j; 来说,其含义是将k绑定到j, 虽然k和j名字不同,但是在硬件上,它们占用同一块内存,既然j是常量,那么k必然是常量,而 int k = j; 就不一样了 const与指针一起使用...这个涉及到类与对象相关的知识,还有成员函数,成员变量,展开讲的话会比较多,后面与类和对象放一起说。 (2)constexpr的用法 上面我们讲了讲const的用法,下面就简单说下constexpr。...constexpr作为限定词在含义上与const并不相同,constexpr是为了在初始化一个变量时,让编译器判断这个变量的值是否是一个常量或常量表达式,如果该变量用constexpr限定,但是初始化值并不是一个常量或者常量表达式...,编译器便会报错,(因为我们在定义常量时并不确定右边的表达式是否是常量表达式),这样看来还是难于解释,下面就用几个例子解释一下: constexpr int a = k +1; constexpr int

    76030

    【笔记】《C++Primer》—— 第7章:类

    ,但是可以在外部定义 在类内定义的函数默认是隐式的内联函数 调用对象的成员函数时,实际上是将对象作为this指针指向的目标传入后执行了一个函数 也即是说,this是类的一个隐式常量指针,指向当前所用的这个实例对象...这个写法的一个用处在于我们无法在常量对象上调用普通成员函数,所以要用常量成员函数代替 编译类时,编译器先编译完成员的声明,然后再回来编译成员的函数体,因此成员函数可以无视顺序使用成员 当要返回当前对象时...对于委托构造函数的函数体,委托者会依次执行被委托的函数的函数体,完成初始化后才执行自己的函数体 想使用默认构造函数时,方法是初始化对象时不使用后面的调用运算符(即小括号对),如直接写Test a; 当构造函数只接受一个实参时...数据成员都是字面值常量的聚合类或不是聚合类但其成员都是字面值,至少含有一个constexpr构造函数,成员若有类内初始值则必由字面值常量或其自己的constexpr构造且类必须使用默认的析构函数的类,称为字面值常量类...它的实参必须由字面值,初始值或constexpr来初始化 7.6 类的静态成员 通过在类的成员前加static来使其成为类的静态成员,与类本身联系在一起,类似于全局范围里的静态变量 类的静态成员存在于所有对象之外

    61420

    Modern c++快速浅析

    const,保留底层const(顶层const:指针本身是常量,底层const:指针所指对象是常量),这点与模板类型推导一致 int* const apc = &a; const int* acp =...constexpr constexpr代表编译期常量,它所标识的值可能被放入到只读内存段中,如数组,非类型模板参数,枚举类型等要求的都是编译期常量,const代表运行期常量。...所有constexpr对象都是const对象,但并非所有的const对象都是constexpr对象 // 都要求编译期常量 int arr[10]; std::array arr; constexpr...,那么代表构造出来的对象可以是一个编译期常量 以修饰函数为例,函数是否的返回值是否满足constexpr取决于两个方面 •传入的参数是否是编译期常量•函数体内的计算是否是编译期能够处理的 当两者条件都能满足时...,它的结果就是constexpr的,否则它的运作方式和普通函数无异(编译器不对constexpr做处理) constexpr int pow(int base, int exp) noexcept {

    20410

    【翻译】C++17的新特性简介

    嵌套的命名空间定义 结构化绑定 带有初始化器的条件语句 常量表达式if UTF-8的字符字面量 枚举的直接列表初始化 [[fallthrough]], [[nodiscard]], [[maybe_unused...一个有问题的例子是对于引用捕获,Lambda要求其对象必须确实存在,但有可能到了调用的时候已经超过了目标对象的生命周期。...,就是现在允许了当expr是一个类似tuple的对象时可以用auto [ x, y, z ] = expr;来初始化,对象中的元素会被绑定到x,y和z上 类似tuple的对象包括std::tuple,...value of type 'error_info', // declared with attribute 'nodiscard' [[maybe_unused]] 向编译器指明某个变量或参数可能不会被使用到是设计中的行为...y) { return x + y; }; Proxy p {add}; p(1, 2); // == 3 std::apply 可以用tuple来作为参数包装调用一个可调用对象

    3.1K10

    通过OpenFoam记录一些c++的trick(持续更新)

    lambda函数: [&](size_t i){ …to do something } 表示传入的是i的地址如果是等于[=],则是传值 6.mutable关键字作用在成员变量前,即使某一个非静态方法后加了...const(即不能修改该函数的类里的任何一个变量),也可以修改改变量 7constexpr:constexpr是C++11中新增的关键字,其语义是“常量表达式”,也就是在编译期可求值的表达式。...最基础的常量表达式就是字面值或全局变量/函数的地址或sizeof等关键字返回的结果,而其它常量表达式都是由基础表达式通过各种确定的运算得到的。...error constexpr int c = a * 2 + 1; // ok constexpr还能用于修饰类的构造函数,即保证如果提供给该构造函数的参数都是constexpr,那么产生的对象中的所有成员都会是...constexpr,该对象也就是constexpr对象了,可用于各种只能使用constexpr的场合。

    49620

    C++的constexpr

    constexpr是C++11引入的关键字,用于定义在编译时求值的常量表达式。它可以修饰函数、对象和模板参数,并要求其在编译时就能够得到计算结果。...常量折叠:当使用constexpr定义多个常量并进行计算时,编译器会尝试在编译时将它们合并为一个常量,以进一步优化代码。...constexpr还可以用于声明对象,这样的对象在编译时就被视为常量。...它们必须满足以下要求: 类型本身是字面值类型,或者是具有字面值类型成员且所有成员都是constexpr的。 构造函数必须是constexpr的,用于在编译时初始化对象。...需要注意的是,在C++11中,对于constexpr函数和对象,编译器的要求比较严格,限制了函数的复杂性和对象的初始化方式。

    23520

    解读C++即将迎来的重大更新(二):C++20的核心语言

    > foo; foo.hello(); } constexpr 虚拟函数 由于动态类型是未知的,所以无法在常量表达式(constant expression)中调用虚拟函数。...这两个新属性都允许为优化器提供提示:执行的路径是更可能或是更不可能。...对于一个即时函数,每一次函数调用都必然产生一个编译时常量表达式。即时函数是隐式的 constexpr 函数。...constinit 会确保有静态存储持续的变量在编译时被初始化。静态存储持续(static storage duration)的意思是对象会在程序开始时分配,在程序结束时又会重新分配。...对于命名空间范围内声明的对象(全局对象),声明为 static 或 extern 的对象有静态存储持续。

    1.1K10

    C++20 中的 `consteval` 和 `constinit` 特性

    C++20 引入了 consteval 和 constinit 两个新关键字,它们与 constexpr 一起,为编译时计算和变量初始化提供了更强大的支持。以下是对这两个特性的详细介绍和用法。...参数限制:函数参数必须是编译时已知的常量表达式。适用场景:用于需要在编译时完成的复杂计算,例如生成常量数组或类型特征。...非常量变量:与 constexpr 不同,constinit 不要求变量是常量,变量可以在运行时修改。适用范围:只能用于具有静态或线程存储期限的变量,不能用于局部变量。...constevalconstinit作用强制函数在编译时计算确保变量在编译时初始化适用对象函数具有静态或线程存储期限的变量运行时调用不允许允许(变量可修改)编译时要求参数必须是常量表达式初始化表达式必须是编译时可计算的...constinit:只能用于静态或线程存储期限的变量。初始化表达式必须是编译时可计算的。

    7410
    领券